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过期事件的更多相关文章
- Spring整合redis实现key过期事件监听
打开redis服务的配置文件 添加notify-keyspace-events Ex 如果是注释了,就取消注释 这个是在以下基础上进行添加的 Spring整合redis:https://www. ...
- redis中key的过期键删除策略
Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...
- 如何利用redis key过期事件实现过期提醒
https://blog.csdn.net/zhu_tianwei/article/details/80169900 redis自2.8.0之后版本提供Keyspace Notifications功能 ...
- Redis中删除过期Key的三种策略
转载自:http://blog.csdn.net/a_bang/article/details/52986935?locationNum=9&fps=1 项目中有个接口要频繁调用查询数据库中的 ...
- Redis Key过期事件
解决方案1: 可以利用redis天然的key自动过期机制,下单时将订单id写入redis,过期时间30分钟,30分钟后检查订单状态,如果未支付,则进行处理但是key过期了redis有通知吗?答案是肯定 ...
- Redis 中的过期元素是如何被处理的?视频+图文版给你答案——面试突击 002 期
本文以面试问题「Redis 中的过期元素是如何被处理的?」为切入点,用视频加图文的方式和大家聊聊 Redis 过期元素被处理的相关知识点. 涉及的知识点 过期删除策略有哪些? 这些过期策略有哪些优缺点 ...
- Redis 中的过期删除策略和内存淘汰机制
Redis 中 key 的过期删除策略 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 ...
- Windows 下Redis的部署 及key 过期事件
window下Redis部署,下载安装完成之后,进入到redis目录: 1.修改配置文件redis.windows.service.conf配置密码 requirepass myRedis (注意在R ...
- redis中关于过期键的删除策略
我们已经了解到了Redis是一种内存数据库,Redis中数据都是以key-value的形式存储在内存中.由Redisserver来维护和管理这部分内存,内存是何足珍贵,不须要的数据或者是已经使用过的无 ...
随机推荐
- TypeScript 之 书写.d.ts文件
https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Writing%20Definition%20Files.html ...
- 自然语言处理工具python调用hanlp中文实体识别
Hanlp作为一款重要的中文分词工具,在GitHub的用户量已经非常之高,应该可以看得出来大家对于hanlp这款分词工具还是很认可的.本篇继续分享一篇关于hanlp的使用实例即Python调用hanl ...
- 写了一个hiero检查任务渲染结果的脚本
基本思路是写了一个时间判断函数(postSequence_check)来对比transcode任务提交时间和目标文件夹内文件的修改时间来确定渲染是否成功执行,然后通过Hiero提供的postSeque ...
- Linux 如何测试 IO 性能(磁盘读写速度)
这几天做MySQL性能测试,偌大一个公司,找几台性能测试机器都很纠结,终于协调到两台,IO的性能如何还不知道.数据库属于IO密集型的应用,所以还是先评估下Server的IO性能,看看是否能和线上的机器 ...
- java中的强,软,弱,虚引用
引用的应用场景 我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型.这正是Java中弱引用和软引用的主要区别. 如果一个对象只有弱引用指向 ...
- python selenium right click on an href and choose Save link as... on Chrome.
From:https://stackoverflow.com/questions/42781483/right-click-on-an-href-and-choose-save-link-as-in- ...
- vmware虚拟机三种网络模式的区别
首先安装了VMware,在其中安装了Ubuntu系统,正常启动之后开始考虑怎么才能够让主机和虚拟机实现网络互连并且由主机向虚拟机发送文件,通过在网上查阅相关资料,记录学习笔记如下. 学习参考资料: l ...
- P1106删数问题
链接 题解: #include<iostream>#include<cstdio>#include<cstring>using namespace std;int ...
- PAT 乙级 1062 最简分数(20) C++版
1062. 最简分数(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 一个分数一般写成两个整数相除的形式: ...
- IDC:网管网
ylbtech-IDC:网管网 1.返回顶部 1. 中文名:网管网.网络管理信息 属 于:电信支撑网 通 过:工作站 网管网: 是接收.处理和传送网络管理信息的电信支撑网,它通过工作站.标 ...