Redis鍵通知機制


Redis鍵通知機制

   一、概念

自從redis2.8.0以后出了一個新特性,Keyspace Notifications 稱為“鍵空間通知”。

這個特性大概是,凡是實現了RedisPub/Sub的客戶端,只需要訂閱相應Channel,就可以獲得對Key操作的一些事件,從而可以處理一些業務。

比如:

1、當你del一個key時,就可以觸發一個del事件通知。

2、一個key的失效時間到了,就會觸發expire事件通知。

3、對一個庫所有key操作,都可以獲取通知。比如對0庫所有key的操作。

注意事項:

1)因為 Redis 目前的訂閱與發布功能采取的是發送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的鍵空間通知可能並不適合你:當訂閱事件的客戶端斷線時, 它會丟失所有在斷線期間分發給它的事件。並不能確保消息送達。

2)Redis Pub/Sub 是一種並不可靠地消息機制,他不會做信息的存儲,只是在線轉發,那么肯定也沒有ack確認機制,另外只有訂閱段監聽時才會轉發!所以Keyspace Notification 也不是可靠地通知系統,如果你的系統需要很好的可靠性,那么Keyspace Notification可能並不是一種很好的選擇。

二、配置

默認情況下,Redis 並不會開啟Keyspace Notification, 我們可以通過修改redis.confnotify-keyspace-events 或者使用CONFIG SET命令來開啟該功能,設置參數,來開啟全部或者部分通知, 以下是設置參數詳細說明列表:

 

 

過期通知的發送時間

Redis 使用以下兩種方式刪除過期的鍵:

1當一個鍵被訪問時,程序會對這個鍵進行檢查,如果鍵已經過期,那么該鍵將被刪除。

2底層系統會在后台漸進地查找並刪除那些過期的鍵,從而處理那些已經過期、但是不會被訪問到的鍵。

當過期鍵被以上兩個程序的任意一個發現、 並且將鍵從數據庫中刪除時, Redis 會產生一個 expired 通知。

Redis 並不保證生存時間(TTL)變為 0 的鍵會立即被刪除: 如果程序沒有訪問這個過期鍵, 或者帶有生存時間的鍵非常多的話, 那么在鍵的生存時間變為 0 , 直到鍵真正被刪除這中間, 可能會有一段比較顯著的時間間隔。

因此, Redis 產生 expired 通知的時間為過期鍵被刪除的時候, 而不是鍵的生存時間變為 0 的時候。

二、訂閱

1)subscribe & psubscribe命令來對特定主題進行訂閱,完成事件通知的過程。

SUBSCRIBE channel [channel ...]

PSUBSCRIBE channelPattern [channelPattern ...]

區別:PSUBSCRIBE  SUBSCRIBE 唯一不同,就是支持通配符。每個模式以 * 作為匹配符,比如 huangz* 匹配所有以 huangz。顯然支持通配符的性能消耗會大一點。

 2)訂閱的表達式

__key空間/事件@數據庫id__:對象  

比如:

__keyspace@0__:mykey     訂閱數據庫0中 mykey的相關事件

__keyevent@0__:del      訂閱數據庫0中的 del事件   

__keyevent@0__:expired   訂閱數據庫0的expired事件

兩者的區別在於,一個是符合key就通知,一個是符合事件就通知。

注意:__是由兩個下划線組成

對於key在哪個數據庫,我們很難知道,那么可以使用"*"匹配所有:

__key*__:*

3)訂閱subscribe與發布publish

 

三、Laravel框架的配合使用

1.app\Console\Commands\OrderFailure.php

handle()函數中處理

參考如圖:

 

 

2.設置監聽的鍵

Redis::setex("shopOrder_".$this->order_id,$timeout*60,$this->order_id);

 

參考鏈接:https://blog.csdn.net/qijiqiguai/article/details/78229111

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM