1. 程式人生 > >keyspace notification(鍵空間通知)

keyspace notification(鍵空間通知)

註冊 class 狀態壓縮 計劃 通知 會有 需求 消息 clas

一、需求分析:

  1. 設置了生存時間的Key,在過期時能不能有所提示?
  2. 如果能對過期Key有個監聽,如何對過期Key進行一個回調處理?
  3. 如何使用 Redis 來實現定時任務?

二、序言:

本文所說的定時任務或者說計劃任務並不是很多人想象中的那樣,比如說每天淩晨三點自動運行起來跑一個腳本。這種都已經爛大街了,隨便一個 Crontab 就能搞定了。

這裏所說的定時任務可以說是計時器任務,比如說用戶觸發了某個動作,那麽從這個點開始過二十四小時我們要對這個動作做點什麽。那麽如果有 1000 個用戶觸發了這個動作,就會有 1000 個定時任務。於是這就不是 Cron 範疇裏面的內容了。

舉個最簡單的例子,一個用戶推薦了另一個用戶,我們定一個二十四小時之後的任務,看看被推薦的用戶有沒有來註冊,如果沒註冊就給他搞一條短信過去。

三、Redis介紹

在 Redis 的 2.8.0 版本之後,其推出了一個新的特性——鍵空間消息(Redis Keyspace Notifications),它配合 2.0.0 版本之後的 SUBSCRIBE 就能完成這個定時任務

的操作了,不過定時的單位是秒。

(1)Publish / Subscribe

Redis 在 2.0.0 之後推出了 Pub / Sub 的指令,大致就是說一邊給 Redis 的特定頻道發送消息,另一邊從 Redis 的特定頻道取值——形成了一個簡易的消息隊列。

(2)Redis Keyspace Notifications

在 Redis 裏面有一些事件,比如鍵到期、鍵被刪除等。然後我們可以通過配置一些東西來讓 Redis 一旦觸發這些事件的時候就往特定的 Channel 推一條消息。

大致的流程就是我們給 Redis 的某一個 db 設置過期事件,使其鍵一旦過期就會往特定頻道推消息,我在自己的客戶端這邊就一直消費這個頻道就好了。

以後一來一條定時任務,我們就把這個任務狀態壓縮成一個鍵,並且過期時間為距這個任務執行的時間差。那麽當鍵一旦到期,就到了任務該執行的時間,Redis 自然會把過期消息推去,我們的客戶端就能接收到了。這樣一來就起到了定時任務的作用。

四、Key過期事件的Redis配置

這裏需要配置 notify-keyspace-events 的參數為 “Ex”。x 代表了過期事件。notify-keyspace-events "Ex" 保存配置後,重啟Redis服務,使配置生效。


重啟Reids服務器:

[email protected]:/etc/redis# service redis-server restart redis.conf
Stopping redis-server: redis-server.
Starting redis-server: redis-server.

添加過期事件訂閱 開啟一個終端,redis-cli 進入 redis 。開始訂閱所有操作,等待接收消息。

[email protected]:~$ redis-cli -h 127.0.01.4 -p 63789
127.0.0.1:63789> psubscribe [email protected]__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "[email protected]__:expired"
3) (integer) 1

再開啟一個終端,redis-cli 進入 redis,新增一個 123秒過期的鍵:

1270.01.1.1:63789> SETEX coolName 123 20
OK
121.41.188.109:63789> get coolName
"20"
121.41.188.109:63789> ttl coolName
(integer) 104

另外一邊執行了阻塞訂閱操作後的終端,123秒過期後有如下信息輸出:

技術分享
121.141.188.209:63789> psubscribe [email protected]__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "[email protected]__:expired"
3) (integer) 1
1) "pmessage"
2) "[email protected]__:expired"
3) "[email protected]__:expired"
4) "coolName"
技術分享

說明:說明對過期Key信息的訂閱是成功的。

keyspace notification(鍵空間通知)