Python利用Redis键空间回调函数执行定时任务

  1. 业务场景:
    a. 用户下单之后,在规定时间内如果不完成付款,订单自动取消,并且释放库存使用技术:Redis键空间通知(过期回调)用户下单之后将订单id作为key,任意值作为值存入redis中,给这条数据设置过期时间,也就是订单超时的时间启用键空间通知
    b. 促销活动结束之后,要回滚库存,促销活动开始之前设置redis,到期删除,通过回调函数拿到key, 执行回调库存脚本

  2. redis下载:
    下载链接:下载链接-转载

  3. redis键空间回调函数介绍:
    在这里插入图片描述

  4. redis发布订阅设置:
    当我们下载好redis后,开始设置reids发布和接收订阅设置(如想彻底了解redis请登录官网查看),设置此功能,因为redis安装好默认此功能关闭
    命令:redis-cli config set notify-keyspace-events Ex (注意:此时开启此功能的默认是0号库)
    设置:
    在这里插入图片描述
    设置成功后的标志:
    命令:redis-cli psubscribe key*@0:"*" 注意粘贴这条命令的时候要将星号里面的双引号去掉
    或:redis-cli psubscribe keyevnet@0:expired
    注意:0为库名
    在这里插入图片描述

  5. python代码实现:
    在python环境中执行命令安装redis: pip install redis
    在cmd中设置key value 过期时间:
    命令:setex bai-12 20 baixiaobai
    在这里插入图片描述
    在python代码中:

import time, json
from redis import StrictRedis

# 连接redis数据库
redis = StrictRedis(host='localhost', port=6379, decode_responses=True, db=0)

# 创建pubsub对象,该对象订阅一个频道并侦听新消息:
pubsub = redis.pubsub()


# 定义触发事件
def event_handler(msg):
    print('Handler', msg)
    print(msg.get('data'))
    data = msg.get('data')
    data_list = data.split('-')
    print(data_list)
    if data_list[0] == 'bai':
        print('想要做事的id{}'.format(data_list[1]))


# 订阅redis键空间通知
pubsub.psubscribe(**{'__keyevent@0__:expired': event_handler})

# 死循环,不停的接收订阅的通知
while True:
    message = pubsub.get_message()
    if message:
        print(message)
        print('aaaaaaaaaaaaaaaaa')
    else:
        time.sleep(0.01)

执行结果:

{'type': 'psubscribe', 'pattern': None, 'channel': '__keyevent@0__:expired', 'data': 1}
aaaaaaaaaaaaaaaaa
Handler {'type': 'pmessage', 'pattern': '__keyevent@0__:expired', 'channel': '__keyevent@0__:expired', 'data': 'bai-12'}
bai-12
['bai', '12']
想要做事的id12
  1. 总结
    可以通过redis建空间回调函数来充当定时任务,来执行你想要执行的脚本,相当于linux中的at命令,两种方式可以结合使用,但是缺点就是对redis的开销较大,Pub / Sub实现要求发布者和订阅者一直处于启动状态。订阅服务器在停止或连接丢失时会丢失数据。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值