無德之人常嫉他人之有德?!喔?/p>
(相關資料圖)
Redis是一種高性能的內(nèi)存數(shù)據(jù)存儲系統(tǒng),它支持多種數(shù)據(jù)結(jié)構和靈活的操作。除了提供常規(guī)的鍵值存儲功能外,Redis還支持訂閱/發(fā)布、事務、Lua腳本等高級功能,其中回調(diào)函數(shù)是Redis的一個重要特性之一。
回調(diào)函數(shù)是一種在特定事件發(fā)生時自動執(zhí)行的函數(shù)。在Redis中,回調(diào)函數(shù)通常用于在特定事件發(fā)生時自動執(zhí)行一些操作。這些事件包括:
客戶端連接/斷開連接數(shù)據(jù)庫鍵過期發(fā)布/訂閱消息通過使用回調(diào)函數(shù),我們可以在這些事件發(fā)生時執(zhí)行一些自定義的邏輯,從而實現(xiàn)更加靈活和復雜的應用程序。
在Redis中,回調(diào)函數(shù)通常是通過在配置文件中定義來注冊的。下面是一個示例配置文件,其中包含了一些回調(diào)函數(shù)的定義:
bashCopy code# Sample Redis configuration file?# Register a callback function to execute when a client connectsclient-connect-callback /path/to/client-connect-script.sh?# Register a callback function to execute when a client disconnectsclient-disconnect-callback /path/to/client-disconnect-script.sh?# Register a callback function to execute when a key expireskeyspace-event-notification expired /path/to/key-expire-script.sh?# Register a callback function to execute when a message is published to a channelnotify-keyspace-events KEA /path/to/pubsub-script.sh
在上面的示例中,我們注冊了四個回調(diào)函數(shù)。第一個回調(diào)函數(shù)在客戶端連接時執(zhí)行,第二個在客戶端斷開連接時執(zhí)行,第三個在鍵過期時執(zhí)行,第四個在消息發(fā)布時執(zhí)行。
要使用回調(diào)函數(shù),我們需要編寫相應的腳本。腳本可以是任何可執(zhí)行文件,如Bash腳本、Python腳本等等。下面是一個示例Bash腳本,用于在客戶端連接時打印一條消息:
bashCopy code#!/bin/bash?echo "A client has connected"
在上面的腳本中,我們使用了echo命令來輸出一條消息。當客戶端連接時,Redis會自動執(zhí)行這個腳本,并將消息輸出到控制臺。
在編寫回調(diào)函數(shù)時,我們還需要考慮一些安全問題。由于回調(diào)函數(shù)通常是在Redis進程的上下文中執(zhí)行的,因此我們需要確保腳本不會執(zhí)行任何危險操作,如刪除文件或執(zhí)行系統(tǒng)命令等等。為了確保安全性,我們可以使用一些技術,如沙盒化或限制腳本執(zhí)行權限等等。
總之,回調(diào)函數(shù)是Redis的一個非常有用的特性,它可以讓我們在特定事件發(fā)生時自動執(zhí)行一些操作,從而實現(xiàn)更加靈活和復雜的應用程序。如果您正在使用Redis,并且想要了解更多關于回調(diào)函數(shù)的內(nèi)容,可以看Redis官方文檔。
例如:京東購物車結(jié)算,在用戶進行結(jié)算的時候,支付時間為30分鐘,用戶未在30分鐘之內(nèi)支付,則需要進入待支付狀態(tài)。
咱們可以采用redis ,key有效期回調(diào)事件實現(xiàn),為每筆支付的訂單設置有限期為30分鐘,在當前key失效的時候,redis進行回調(diào)。
首先找到redis.conf配置文件,如果你跟我一樣使用mac包管理工具brew安裝的。
找到homebrew.mxcl.redis.plist
文件
打開之后就可以看到redis.conf的文件地址了。
打開配置文件之后找到notify-keyspace-events ""
,然后設置成notify-keyspace-events "Ex"
notify-keyspace-events 的參數(shù)可以是以下字符的任意組合,它指定了服務器該發(fā)送哪些類型的通知:
字符 | 發(fā)送的通知 |
---|---|
K | 鍵空間通知,所有通知以__keyspace@ |
E | 鍵事件通知,所有通知以 __keyevent@ |
g | DEL 、 EXPIRE 、 RENAME 等類型無關的通用命令的通知 |
$ | 字符串命令的通知 |
l | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合命令的通知 |
x | 過期事件,每當有過期鍵被刪除時發(fā)送 |
e | 驅(qū)逐事件,每當有鍵因為maxmemory政策而被刪除時發(fā)送 |
A | 參數(shù) g$lshzxe 的別名 |
首先發(fā)送一條普通消息,設置過期時間。
@ApiOperation(value = "測試redis回調(diào)") @SaCheckLogin @PostMapping("/test") public ApiResponse testTask(){ redisUtil.set("FILE:userInfo","我是一條消息,來測試是否進入回調(diào)",60); return ApiResponse.ok(); }
添加RedisListenerConfig
回調(diào)配置類
@Slf4j@Configurationpublic class RedisListenerConfig {? @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; }? @Component public static class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer container) { super(container); } @Override public void onMessage(Message message, byte[] pattern) { final String keyInfo = "FILE:userInfo"; String key = message.toString(); log.info("redis失效進入回調(diào)函數(shù)攜帶key:{}", key); if (key != null && key.startsWith(keyInfo)) { log.info("需要特殊處理的key,進行業(yè)務處理"); } } }}