剛到新公司乙個月左右,有個新需求,想做定時任務,比如在使用者註冊時間的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
importredis
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
importredis
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的鍵事件通知,客戶端訂閱這個通知事件,服務端...