Redis鍵通知機制

Redis鍵通知機制php

   1、概念redis

自從redis2.8.0之後出了一個新特性,Keyspace Notifications 稱爲「鍵空間通知」。數據庫

這個特性大概是,凡是實現了RedisPub/Sub的客戶端,只須要訂閱相應Channel,就能夠得到對Key操做的一些事件,從而能夠處理一些業務。app

好比:框架

1、當你del一個key時,就能夠觸發一個del事件通知。函數

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

3、對一個庫全部key操做,均可以獲取通知。好比對0庫全部key的操做。this

注意事項:spa

1)由於 Redis 目前的訂閱與發佈功能採起的是發送即忘(fire and forget)策略, 因此若是你的程序須要可靠事件通知(reliable notification of events), 那麼目前的鍵空間通知可能並不適合你:當訂閱事件的客戶端斷線時, 它會丟失全部在斷線期間分發給它的事件。並不能確保消息送達。.net

2)Redis Pub/Sub 是一種並不可靠地消息機制,他不會作信息的存儲,只是在線轉發,那麼確定也沒有ack確認機制,另外只有訂閱段監聽時纔會轉發!因此Keyspace Notification 也不是可靠地通知系統,若是你的系統須要很好的可靠性,那麼Keyspace Notification可能並非一種很好的選擇。

2、配置

默認狀況下,Redis 並不會開啓Keyspace Notification, 咱們能夠經過修改redis.confnotify-keyspace-events 或者使用CONFIG SET命令來開啓該功能,設置參數,來開啓所有或者部分通知, 如下是設置參數詳細說明列表:

 

 

過時通知的發送時間

Redis 使用如下兩種方式刪除過時的鍵:

1當一個鍵被訪問時,程序會對這個鍵進行檢查,若是鍵已通過期,那麼該鍵將被刪除。

2底層系統會在後臺漸進地查找並刪除那些過時的鍵,從而處理那些已通過期、可是不會被訪問到的鍵。

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

Redis 並不保證生存時間(TTL)變爲 0 的鍵會當即被刪除: 若是程序沒有訪問這個過時鍵, 或者帶有生存時間的鍵很是多的話, 那麼在鍵的生存時間變爲 0 , 直到鍵真正被刪除這中間, 可能會有一段比較顯著的時間間隔。

所以, Redis 產生 expired 通知的時間爲過時鍵被刪除的時候, 而不是鍵的生存時間變爲 0 的時候。

2、訂閱

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

 

3、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

相關文章
相關標籤/搜索