1. 程式人生 > 實用技巧 >Redis鍵空間通知(Keyspace Notifications)

Redis鍵空間通知(Keyspace Notifications)

鍵空間通知(Keyspace Notification)是一個從Redis 2.8.0版本開始可用的功能。

1、簡介:

鍵空間通知基於訂閱Pub/Sub(釋出/訂閱),當庫中的key發生改變時,能夠對你感興趣的事件進行通知。

可能接收到的事件示例,如下所示:

  • 所有影響到一個給定鍵的命令。
  • 所有接收到一個LPUSH命令的鍵。
  • 所有資料庫-0中的鍵全都過期。

注:因為Redis的Pub/Sub功能當前是“觸發後不管(Fire and Forget)”的,所以如果你的應用程式需要的是可靠的訊息通知,那麼它就不能使用Redis的鍵空間通知功能。也就是說,如果你的Pub/Sub客戶端斷開連線,然後再重新連線,那麼在客戶端斷開連線的期間內傳遞的所有事件都會丟失。

2、通知型別:

對於每個修改資料庫的操作,鍵空間通知都會發送兩種不同型別的事件。以set操作為例,當在資料庫-0中的新增一個名為key1的鍵時,將會觸發Redis傳遞兩條訊息,完全等價於下面兩條PUBLISH命令:

publish __keyspace@0__:key1 set
publish __keyevent@0__:set key1

我們簡單地看一下這兩條命令,keyspace表示鍵空間通知,keyevent表示鍵事件通知。

  • keyspace:鍵空間通知,監聽的頻道/通道是 __keyspace@當前庫的編號 __:操作的key ,訊息的內容是事件的名稱
  • keyevent:鍵事件通知,監聽的頻道/通道是__keyevent@當前庫的編號__:事件的名稱
    ,訊息的內容是操作的key

keyspace為字首的頻道被稱為鍵空間通知(key-space notification), 而以keyevent為字首的頻道則被稱為鍵事件通知(key-event notification)。

為了只對我們感興趣的事件進行監聽,我們需要對notify-keyspace-events進行配置。

3、配置notify-keyspace-events

在預設情況下,鍵空間的事件通知功能是禁用的(notify-keyspace-events “”),因為這個功能會消耗一些CPU效能,雖然幾乎感覺不到效能消耗。有兩種方法可以啟用通知功能:修改redis.conf檔案的notify-keyspace-events

引數,或者使用CONFIG SET命令。接下來看看具體如何對notify-keyspace-events進行配置:

It is possible to select the events that Redis will notify among a set
 of classes. Every class is identified by a single character:

  K     Keyspace events, published with __keyspace@<db>__ prefix.
     鍵空間(Keyspace)事件,通過__keyspace@<db>__字首的頻道釋出。
  E     Keyevent events, published with __keyevent@<db>__ prefix.
     鍵事件(Keyevent)事件,通過__keyevent@<db>__字首的頻道釋出。

  g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
     通用的命令(不特定型別),例如:DEL、EXPIRE、RENAME,等等。
  $     String commands
        對字串相關命令進行釋出
  l     List commands
        對列表相關命令進行釋出
  s     Set commands
        對集合相關命令進行釋出
  h     Hash commands
        對雜湊相關命令進行釋出
  z     Sorted set commands
        對有序集合相關命令進行釋出
  x     Expired events (events generated every time a key expires)
        過期事件(每當一個鍵過期時,對這個鍵的過期事件進行釋出)
  e     Evicted events (events generated when a key is evicted for maxmemory)
        記憶體回收事件(當達到最大記憶體,然後回收某個鍵的記憶體時,對這個件的記憶體回收事件進行釋出)。
  A     Alias for g$lshzxe, so that the "AKE" string means all the events.
        g$lshzxe的別名。因此,“AKE”字串可以表示所有的事件。

notify-keyspace-events ""

配置字串至少應當包含KE字元。否則,即使這個字串包含其他任何字元,Redis也不會傳遞任何事件。

例如我們只想要對字串操作進行監聽,並且只想通過鍵事件通知進行監聽,那麼我們可以這麼配:“E$“;如果想監聽所有事件可以配置為“AKE”。

4、不同命令產生的事件

命令 產生的事件
DEL 這個命令會為每個被刪除的鍵產生一個del事件。
RENAME 這個命令會產生兩個事件,一個為原始鍵產生的rename_from事件,以及一個為目標鍵產生的rename_to事件。
EXPIRE 當為某個鍵設定過期時間時,這個命令便會產生一個expire事件;或者,每當為某個待刪除的鍵設定一個過期結果時,這個命令便會產生一個expired事件(請參考EXPIRE命令的相關文件)。
SORT 當使用STORE選項來設定一個新鍵時,這個命令便會產生一個sortstore事件。如果結果列表為空,並且使用了STORE選項,並且已經存在一個同名的鍵,那麼Redis便會刪除這個已有的鍵,在這種情況下,這個命令還會產生一個del事件。
SET 這個命令,以及它的所有變種(SETEX、SETNX、GETSET)命令,都會產生set事件。除此之外,SETEX命令還會產生一個expire事件。
MSET 這個命令會為每個鍵單獨產生一個set事件。
SETRANGE 這個命令會產生一個setrange事件。
INCR、DECR、INCRBY、DECRBY 這些命令都會產生incrby事件。
INCRBYFLOAT 這個命令會產生一個incrbyfloat事件。
APPEND 這個命令會產生一個append事件。
LPUSH、LPUSHX 這些命令都會產生一個lpush事件,即使有多個輸入元素時,也是如此
RPUSH、RPUSHX 這些命令都會產生一個rpush事件,即使有多個輸入元素時,也是如此。
RPOP 這個命令會產生一個rpop事件。另外,如果從列表中彈出最後一個元素,那麼這個列表對應的鍵就會被刪除,此時還會產生一個del事件。
LPOP

這個命令會產生一個lpop事件。另外,如果從列表中彈出最後一個元素,那麼這個列表對應的鍵就會被刪除,此時還會產生一個del事件。

LINSERT 這個命令會產生一個linsert事件。
LSET 這個命令會產生一個lset事件。
LREM 這個命令會產生一個lrem事件。另外,如果執行這個命令之後,列表變為空表,那麼便會刪除這個列表對應的鍵,此時還會產生一個del事件。
LTRIM 這個命令會產生一個ltrim事件。另外,如果執行這個命令之後,列表變為空表,那麼便會刪除這個列表對應的鍵,此時還會產生一個del事件。
RPOPLPUSH、BRPOPLPUSH 這兩個命令都會產生一個rpop事件和lpush事件。這兩個事件的產生順序都是固定不變的,先產生rpop事件,然後再產生lpush事件。另外,如果執行這兩個命令之後,列表變為空表,那麼便會刪除這個列表對應的鍵,此時還會產生一個del事件。
HSET、HSETNX、HMSET 這些命令都會產生一個hset事件。
HINCRBY 這個命令會產生一個hincrby事件。
HINCRBYFLOAT 這個命令會產生一個hincrbyfloat事件。
HDEL 這個命令會產生一個hdel事件。如果執行這個命令之後,雜湊變為空,那麼便會刪除這個雜湊對應的鍵,此時還會產生一個del事件。
SADD 這個命令會產生一個sadd事件,即使有多個輸入元素時,也是如此。
SREM 這個命令會產生一個srem事件。如果執行這個命令之後,集合變為空,那麼便會刪除這個集合對應的鍵,此時還會產生一個del事件。
SMOVE 這個命令會為原始鍵產生一個srem事件,然後為目標鍵產生一個sadd事件
SPOP 這個命令會產生一個spop事件。如果執行這個命令之後,集合變為空,那麼便會刪除這個集合對應的鍵,此時還會產生一個del事件。

SINTERSTORE、SUNIONSTORE

、SDIFFSTORE

這些命令會分別產生sinterstoresunionostoresdiffstore事件。在特殊情況下,如果執行這些命令得到的集合為空,並且用於儲存結果的鍵已經存在,那麼這個鍵將會被刪除,然後還會產生一個del事件。
ZINCRBY 這個命令會產生一個zincr事件。
ZADD 這個命令會產生一個zadd事件,即使有多個輸入元素時,也是如此。
ZREM 這個命令會產生一個zrem事件,即使需要刪除多個元素時,也是如此。如果執行這個命令之後,有序集合變為空,那麼便會刪除這個有序集合對應的鍵,此時還會產生一個del事件。
ZREMRANGEBYSCORE 這個命令會產生一個zrembyscore事件。如果執行這個命令之後,有序集合變為空,那麼便會刪除這個有序集合對應的鍵,此時還會產生一個del事件
ZREMRANGEBYRANK 這個命令會產生一個zrembyrank事件。如果執行這個命令之後,有序集合變為空,那麼便會刪除這個有序集合對應的鍵,此時還會產生一個del事件。
ZINTERSTORE、ZUNIONSTORE 這兩個命令會分別產生zinterstorezunionstore事件。在特殊情況下,如果執行這些命令得到的有序集合為空,並且用於儲存結果的鍵已經存在,那麼這個鍵將會被刪除,然後還會產生一個del事件。

當然,你也可以將notify-keyspace-events 設定為"AKE",然後對各種命令進行嘗試,通過訂閱__key*__:*即可接收到所有操作的訊息。


參考:https://zhuanlan.zhihu.com/p/103963089