redis中key过期事件

Posted RGC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis中key过期事件相关的知识,希望对你有一定的参考价值。

刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的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@<db>__为前缀
# E    键事件通知,以__keysevent@<db>__为前缀
# 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

以上是关于redis中key过期事件的主要内容,如果未能解决你的问题,请参考以下文章

Redis Key 过期事件监听

Spring boot实现监听Redis key过期事件

SpringBoot 监听Redis key过期回调

SpringBoot 监听Redis key过期回调

Redis Key过期通知

redis的key过期事件不建议实现延时消息的原因