-
业务场景:
a. 用户下单之后,在规定时间内如果不完成付款,订单自动取消,并且释放库存使用技术:Redis键空间通知(过期回调)用户下单之后将订单id作为key,任意值作为值存入redis中,给这条数据设置过期时间,也就是订单超时的时间启用键空间通知
b. 促销活动结束之后,要回滚库存,促销活动开始之前设置redis,到期删除,通过回调函数拿到key, 执行回调库存脚本 -
redis下载:
下载链接:下载链接-转载 -
redis键空间回调函数介绍:
-
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为库名
-
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
- 总结:
可以通过redis建空间回调函数来充当定时任务,来执行你想要执行的脚本,相当于linux中的at命令,两种方式可以结合使用,但是缺点就是对redis的开销较大,Pub / Sub实现要求发布者和订阅者一直处于启动状态。订阅服务器在停止或连接丢失时会丢失数据。