redis中key過期事件

2021-10-01 21:26:32 字數 2210 閱讀 4831

剛到新公司乙個月左右,有個新需求,想做定時任務,比如在使用者註冊時間的3天後推送使用者一條訊息。

從剛開始腦子裡面閃現的資料庫輪詢,立馬否定掉(浪費資源),再到linux系統的定時任務,但是當使用者量過大時,肯定不行。

最後想著redis如果key過期了,能不能監聽觸發乙個事件,這樣便可以不用時刻的查詢是否到了傳送訊息的時間,從而節省資源。

最終找到了 redis的key過期事件。通過監聽redis的過期時間,在過期時觸發乙個事件,從而通過這個事件做其他事情。

操作步驟(liunx系統):

1.找到redis.conf配置檔案,可以通過命令  find / | grep redis.conf

2.修改配置檔案,找到 notify-keyspace-events,預設是被注釋的,改為   notify-keyspace-events ex

#

k 鍵空間通知,以__keyspace@__為字首

#e 鍵事件通知,以__keysevent@__為字首

#g del , expipre , rename 等型別無關的通用命令的通知, ...

#$ string命令

#l list命令

#s set命令

#h hash命令

#z 有序集合命令

#x 過期事件(每次key過期時生成)

#e 驅逐事件(當key在記憶體滿了被清除時生成)

#a g$lshzxe的別名,因此」ake」意味著所有的事件

3.重啟redis; 輸入命令:service redis-server restart 

4.編寫python**:

redis_fabu.py

import

redis

import

time

r = redis.redis(host='

127.0.0.1

', port=6379, db=0)

# r.publish('fm87.7', 'send msg') #可以發布固定的頻道

r.setex(name='

test-name

',value='

val',time=1)

redis_dingyue.py

import

redis

r = redis.redis(host='

127.0.0.1

', port=6379, db=0)

# sub.subscribe('fm87.7') #可以訂閱固定的頻道

sub_expire = r.pubsub()

#事件通過 redis 的訂閱與發布功能(pub/sub)來進行分發,故需要訂閱 __keyevent@0__:expired,其中0表示dbindex

sub_expire.subscribe('

__keyevent@0__:expired')

while

true:

ex_pire=sub_expire.parse_response()

print(ex_pire[0],ex_pire[1],ex_pire[2])

輸出結果為:

b'

subscribe

' b'

__keyevent@0__:expired

' 1b

'message

' b'

__keyevent@0__:expired

' b'

test-name

'

notice:

1.redis的key過期事件在獲返回結果時是 key的值,所以在做相關任務時,可以把key名寫成需要執行的函式名等等。

2.redis的key過期事件是通過發布訂閱機制,如果在key過期發布觸發事件時,沒有訂閱服務的話,此過期事件會被捨棄掉,也就是發布過期事件,但是無法判斷是否被訂閱到,並且不會儲存此次過期事件。所以要時刻確保 訂閱機制完好。

3.  sub_expire.subscribe('__keyevent@0__:expired') 中 __keyevent@0__:expired 的 0 表示資料庫index,表示只觸發本資料庫的過期事件。

4.由於redis放在記憶體中,所以做好備份到硬碟的工作,儘量減少資料損失。

redis過期key監聽

修改配置檔案 redis.conf notify keyspace events ex k 鍵空間通知,以 keyspace 為字首 e 鍵事件通知,以 keysevent 為字首 g del expipre rename 等型別無關的通用命令的通知,string命令 l list命令 s set命...

Redis如何過期key

過期redis key有兩種方式 被動和主動方式。被動過期 當一些客戶端要訪問這個key時,發現它已經過期,則刪除。顯然這樣做是不夠的,因為可能有些key不會被再次訪問。這種情況下也同樣要刪除這些過期的key。因此就有了主動過期的方式。主動過期 redis會定期,通過隨機的方式在設定了過期時間的ke...

redis監聽key過期

檢視redis版本 redis server v redis server version 要使redis可以監聽到key過期,需新增配置,實現原理 在redis2.8之後的版本中,當我們將對使用redis快取起來並設定快取失效時間的時候,會觸發redis的鍵事件通知,客戶端訂閱這個通知事件,服務端...