使用Redis实现订单到时取消操作

    xiaoxiao2022-07-03  122

    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 方法二: redis-cli config set 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://blog.csdn.net/weixin_44033012/article/details/91380377

    https://cloud.tencent.com/developer/article/1347437

    最新回复(0)