redisでkeyが期限切れになったイベント
5319 ワード
新会社に着いたばかりの1ヶ月ほどで、ユーザーの登録時間の3日後にユーザーにメッセージをプッシュするなど、タイミングタスクをしたいという新しいニーズがあります.
最初から頭の中に浮かんだデータベースポーリングは、すぐに否定(リソースの浪費)し、linuxシステムのタイミングタスクまでですが、ユーザー量が多すぎると、絶対にだめです.
最後にredisがkeyが期限切れになった場合、トリガされたイベントをリスニングできるかどうかを考えます.これにより、メッセージを送信する時間になったかどうかを常にクエリしなくても、リソースを節約できます.
最終的にredisのkey期限切れイベントが見つかりました.redisの有効期限を傍受することで、有効期限が切れたときにイベントをトリガーし、このイベントを通じて他のことをします.
操作手順(liunxシステム):
1.redisを見つけます.confプロファイルは、コマンドfind/|grep redis.conf
2.プロファイルを変更し、notify-keyspace-eventsを見つけ、デフォルトはコメントされ、notify-keyspace-events Exに変更
3.redisを再起動する.入力コマンド:service redis-server restart
4.pythonコードの作成:
redis_fabu.py
redis_dingyue.py
出力結果:
Notice:
1.redisのkey期限切れイベントは、返された結果が得られたときにkeyの値であるため、関連タスクを行うときにkey名を実行する必要がある関数名などに書くことができる.
2.redisのkey期限切れイベントは、サブスクリプションをパブリッシュするメカニズムによって、key期限切れパブリケーションによってイベントがトリガーされたときにサブスクリプションサービスがなければ、この期限切れイベントは破棄されます.つまり、期限切れイベントがパブリッシュされますが、サブスクリプションされたかどうかは判断できません.また、今回の期限切れイベントは保存されません.購読メカニズムが完全であることを常に確保しなければならない.
3. sub_expire.subscribe('__keyevent@0__:expired')中_keyevent@0__:expiredの0はデータベースindexを表し、本データベースの期限切れイベントのみがトリガーされることを示します.
4.redisはメモリに格納されているため、ハードディスクへのバックアップをしっかりと行い、データ損失を最小限に抑える.
関連接続:
https://www.jianshu.com/p/eb27967739cd
https://www.jianshu.com/p/eb27967739cd
http://www.cnblogs.com/wujf/p/8080109.html
https://www.cnblogs.com/chen-lhx/p/6626371.html
https://blog.csdn.net/qq744746842/article/details/70195945
転載先:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_692days.html
最初から頭の中に浮かんだデータベースポーリングは、すぐに否定(リソースの浪費)し、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' 1
b'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はメモリに格納されているため、ハードディスクへのバックアップをしっかりと行い、データ損失を最小限に抑える.
関連接続:
https://www.jianshu.com/p/eb27967739cd
https://www.jianshu.com/p/eb27967739cd
http://www.cnblogs.com/wujf/p/8080109.html
https://www.cnblogs.com/chen-lhx/p/6626371.html
https://blog.csdn.net/qq744746842/article/details/70195945
転載先:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_692days.html