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@當前庫的編號__:事件的名稱
以keyspace
為字首的頻道被稱為鍵空間通知(key-space notification), 而以keyevent
為字首的頻道則被稱為鍵事件通知(key-event notification)。
為了只對我們感興趣的事件進行監聽,我們需要對notify-keyspace-events進行配置。
3、配置notify-keyspace-events
在預設情況下,鍵空間的事件通知功能是禁用的(notify-keyspace-events “”),因為這個功能會消耗一些CPU效能,雖然幾乎感覺不到效能消耗。有兩種方法可以啟用通知功能:修改redis.conf檔案的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 ""
配置字串至少應當包含K
或E
字元。否則,即使這個字串包含其他任何字元,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 |
這個命令會產生一個 |
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 |
這些命令會分別產生sinterstore 、sunionostore 和sdiffstore 事件。在特殊情況下,如果執行這些命令得到的集合為空,並且用於儲存結果的鍵已經存在,那麼這個鍵將會被刪除,然後還會產生一個del 事件。 |
ZINCRBY | 這個命令會產生一個zincr 事件。 |
ZADD | 這個命令會產生一個zadd 事件,即使有多個輸入元素時,也是如此。 |
ZREM | 這個命令會產生一個zrem 事件,即使需要刪除多個元素時,也是如此。如果執行這個命令之後,有序集合變為空,那麼便會刪除這個有序集合對應的鍵,此時還會產生一個del 事件。 |
ZREMRANGEBYSCORE | 這個命令會產生一個zrembyscore 事件。如果執行這個命令之後,有序集合變為空,那麼便會刪除這個有序集合對應的鍵,此時還會產生一個del 事件 |
ZREMRANGEBYRANK | 這個命令會產生一個zrembyrank 事件。如果執行這個命令之後,有序集合變為空,那麼便會刪除這個有序集合對應的鍵,此時還會產生一個del 事件。 |
ZINTERSTORE、ZUNIONSTORE | 這兩個命令會分別產生zinterstore 和zunionstore 事件。在特殊情況下,如果執行這些命令得到的有序集合為空,並且用於儲存結果的鍵已經存在,那麼這個鍵將會被刪除,然後還會產生一個del 事件。 |
當然,你也可以將notify-keyspace-events 設定為"AKE",然後對各種命令進行嘗試,通過訂閱__key*__:*即可接收到所有操作的訊息。