一 、功能概覽
鍵空間通知使得客戶端可以透過訂閱頻道或模式, 來接收那些以某種方式改變了 Redis key變化的事件。
所有修改key鍵的指令。
所有接收到 LPUSH key value [value …] 指令的鍵。
db資料庫中所有已過期的鍵。
事件透過Redis 的訂閱與發布功能(pub/sub)來進行分發, 因此所有支援訂閱與發布功能的用戶端都可以在無須做任何修改的情況下, 直接使用鍵空間通知功能。
因為Redis 目前的訂閱與發布功能採取的是發送即忘(fire and forget)策略, 所以如果你的程式需要可靠事件通知(reliable notification of events), 那麼目前的鍵空間通知可能不適合你: 當訂閱事件的客戶端斷線時, 它會失去所有在斷線期間分發給它的事件。
未來將會支援更可靠的事件分發, 這種支援可能會透過讓訂閱與發布功能本身變得更可靠來實現, 也可能會在Lua 腳本中對訊息(message)的訂閱與發布進行監聽, 從而實現類似將事件推入到列表這樣的操作。
二、事件類型
對於每個修改資料庫的操作,鍵空間通知都會傳送兩種不同類型的事件。
比如說,對 0
號資料庫的鍵 mykey
執行 DEL key [key …]
指令時,系統會分發兩條訊息,相當於執行下列兩個 PUBLISH channel message
指令:
PUBLISH __keyspace@0__:mykey del PUBLISH __keyevent@0__:del mykey
訂閱第一個頻道__keyspace@0__:mykey 可以接收0 號資料庫中所有修改鍵mykey 的事件,而訂閱第二個頻道__keyevent@0__:del則可以接收0 號資料庫中所有執行del 指令的鍵。
以 keyspace 為前綴的頻道稱為鍵空間通知(key-space notification), 而以 keyevent 為前綴的頻道則稱為按鍵事件通知(key-event notification)。
當 del mykey 指令執行時:
鍵空間頻道的訂閱者將接收到被執行的事件的名字,在這個例子中,就是 del 。
鍵事件頻道的訂閱者將會接收到被執行事件的鍵的名字,在這個例子中,就是 mykey 。
三、設定
因為開啟鍵空間通知功能需要消耗一些 CPU , 所以在預設設定下, 此功能處於關閉狀態。
可以透過修改redis.conf 文件, 或直接使用CONFIG SET 指令開啟或關閉鍵空間通知功能:
當notify-keyspace-events 選項的參數為空字串時,功能關閉。
另一方面,當參數不是空字串時,功能開啟。
notify-keyspace-events 的參數可以是以下字元的任意組合, 它指定了伺服器該發送哪些類型的通知:
輸入的參數中至少要有一個 K
或 E
, 否則的話, 不管其餘的參數是什麼, 都不會有任何通知被分發。
舉個例子, 如果只想訂閱鍵空間中和列表相關的通知, 那麼參數就應該設為 Kl
,諸如此類。
將參數設為字串"AKE"
表示發送所有類型的通知。
每當一個鍵因為過期而被刪除時,產生一個
expired
通知。每當一個鍵因為
maxmemory
政策而被刪除以回收記憶體時,產生一個evicted
通知。
所有指令都只在鍵真的被改動了之後,才會產生通知。
比如說,當 SREM key member [member …]
試圖刪除不存在於集合的元素時,刪除操作會執行失敗,因為沒有真正的改動鍵,所以這一操作不會發送通知。
如果對命令所產生的通知有疑問, 最好還是使用以下命令, 自己來驗證一下:
Redis 使用以下兩種方式刪除過期的鍵:
當一個鍵被存取時,程式會對這個鍵進行檢查,如果鍵已經過期,那麼該鍵將會被刪除。
底層系統會在後台漸進地尋找並刪除那些過期的鍵,從而處理那些已經過期、但是不會被存取到的鍵。
當過期鍵被以上兩個程式的任意一個發現、 並且將鍵從資料庫中刪除時, Redis 會產生一個 expired 通知。
Redis 不保證生存時間(TTL)變成0 的鍵會立即被刪除: 如果程式沒有存取這個過期鍵, 或帶有生存時間的鍵非常多的話, 那麼在鍵的生存時間變為0 , 直到鍵真正被刪除這中間, 可能會有一段比較顯著的時間間隔。
因此, Redis 产生expired通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0 的时候。
三、案例
按上文内容,我们先将redis的键空间通知开启,我们开启所有的通知,在可以端中测试后没问题再到代码中测试。
连接到redis 输入一下命令
config set notify-keyspace-events KEA
订阅键空间和键事件的主题
psubscribe '__key*__:*'#对所有库键空间通知 psubscribe '__keyspace@2__:*' #是对db2数据库键空间通知 psubscribe '__keyspace@2__:order*' #是对db2数据库,key前缀为order所有键的键空间通知
创建一个 key :name valus:zhangsan
set name wsl
观察订阅的窗口 会受到两个消息,第一个是:键空间 第二个是键事件,键空间是内容是操作指令,主题中包含有key,键事件主题中包含了指令,内容是key。
到这里说明已经开启了键空间通知
代码
以下代码采用string类型演示
在配置一下MessageListenerContainer
类,将我们写好的监听类添加到该类中即可,删除和过期都是需要添加,我这里就一起添加了后面就不做演示。
@Configuration public class RedisConfig { @Autowired private RedisTemplate redisTemplate; @Autowired private RedisUpdateAndAddListener redisUpdateAndAddListener; @Autowired private RedisDeleteListener redisDeleteListener; @Autowired private RedisExpiredListener redisExpiredListener; @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); //监听所有的key的set事件 container.addMessageListener(redisUpdateAndAddListener, redisUpdateAndAddListener.getTopic()); //监听所有key的删除事件 container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic()); //监听所有key的过期事件 container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic()); return container; } }
新增和修改都是set指令
所以监听的主题都一样,实现MessageListener
接口,重写onMessage
这里就是收到消息的处理逻辑
@Component @Data public class RedisUpdateAndAddListener implements MessageListener { //监听的主题 private final PatternTopic topic = new PatternTopic("__keyevent@*__:set"); @Override public void onMessage(Message message,byte[] pattern){ String topic = new String(pattern); String msg = new String(message.getBody()); System.out.println("收到key更新或修改,消息主题是:"+ topic+",消息内容是:"+msg); } }
在redis中对name这个key进行set操作
set name wsl
在控制台就可以看到name这个key被操作了
删除
跟上面的更新监听一样,只需要把订阅主题更改一下即可。同样需要添加到这个RedisMessageListenerContainer
,上面已经添加,这里不做演示
@Component @Data public class RedisDeleteListener implements MessageListener { //监听主题 private final PatternTopic topic = new PatternTopic("__keyevent@*__:del"); /** * * @param message 消息 * @param pattern 主题 */ @Override public void onMessage(Message message, byte[] pattern) { String topic = new String(pattern); String msg = new String(message.getBody()); System.out.println("收到key的删除,消息主题是:"+ topic+",消息内容是:"+msg); } }
在redis输入命令,del name
在控制台可以看到已经收到消息了。
过期
如上面的操作方式一样
@Data @Component public class RedisExpiredListener implements MessageListener { //监听主题 private final PatternTopic topic = new PatternTopic("__keyevent@*__:expired"); @Override public void onMessage(Message message, byte[] pattern) { String topic = new String(pattern); String msg = new String(message.getBody()); System.out.println("收到key的过期,消息主题是:"+ topic+",消息内容是:"+msg); } }
在redis中写一个定时删除的keySETEX age 18 3
三秒后就可以控制台打印了相关信息
以上是SpringBoot怎麼監聽redis Key變化事件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

RedisisclassifiedasaNoSQLdatabasebecauseitusesakey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.Itoffersspeedandflexibility,makingitidealforreal-timeapplicationsandcaching,butitmaynotbesuitableforscenariosrequiringstrictdataintegrityo

Redis通過緩存數據、實現分佈式鎖和數據持久化來提升應用性能和可擴展性。 1)緩存數據:使用Redis緩存頻繁訪問的數據,提高數據訪問速度。 2)分佈式鎖:利用Redis實現分佈式鎖,確保在分佈式環境中操作的安全性。 3)數據持久化:通過RDB和AOF機制保證數據安全性,防止數據丟失。

Redis的數據模型和結構包括五種主要類型:1.字符串(String):用於存儲文本或二進制數據,支持原子操作。 2.列表(List):有序元素集合,適合隊列和堆棧。 3.集合(Set):無序唯一元素集合,支持集合運算。 4.有序集合(SortedSet):帶分數的唯一元素集合,適用於排行榜。 5.哈希表(Hash):鍵值對集合,適合存儲對象。

Redis的數據庫方法包括內存數據庫和鍵值存儲。 1)Redis將數據存儲在內存中,讀寫速度快。 2)它使用鍵值對存儲數據,支持複雜數據結構,如列表、集合、哈希表和有序集合,適用於緩存和NoSQL數據庫。

Redis是一個強大的數據庫解決方案,因為它提供了極速性能、豐富的數據結構、高可用性和擴展性、持久化能力以及廣泛的生態系統支持。 1)極速性能:Redis的數據存儲在內存中,讀寫速度極快,適合高並發和低延遲應用。 2)豐富的數據結構:支持多種數據類型,如列表、集合等,適用於多種場景。 3)高可用性和擴展性:支持主從復制和集群模式,實現高可用性和水平擴展。 4)持久化和數據安全:通過RDB和AOF兩種方式實現數據持久化,確保數據的完整性和可靠性。 5)廣泛的生態系統和社區支持:擁有龐大的生態系統和活躍社區,

Redis的關鍵特性包括速度、靈活性和豐富的數據結構支持。 1)速度:Redis作為內存數據庫,讀寫操作幾乎瞬時,適用於緩存和會話管理。 2)靈活性:支持多種數據結構,如字符串、列表、集合等,適用於復雜數據處理。 3)數據結構支持:提供字符串、列表、集合、哈希表等,適合不同業務需求。

Redis的核心功能是高性能的內存數據存儲和處理系統。 1)高速數據訪問:Redis將數據存儲在內存中,提供微秒級別的讀寫速度。 2)豐富的數據結構:支持字符串、列表、集合等,適應多種應用場景。 3)持久化:通過RDB和AOF方式將數據持久化到磁盤。 4)發布訂閱:可用於消息隊列或實時通信系統。

Redis支持多種數據結構,具體包括:1.字符串(String),適合存儲單一值數據;2.列表(List),適用於隊列和棧;3.集合(Set),用於存儲不重複數據;4.有序集合(SortedSet),適用於排行榜和優先級隊列;5.哈希表(Hash),適合存儲對像或結構化數據。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)