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    键空间通知,以[email protected]<db>__为前缀
# E    键事件通知,以[email protected]<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.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_expire = r.pubsub()
# 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发,故需要订阅 [email protected]__:expired,其中0表示dbindex
sub_expire.subscribe(‘[email protected]__:expired‘)

while True:
    ex_pire=sub_expire.parse_response()
    print(ex_pire[0],ex_pire[1],ex_pire[2])

输出结果为:

b‘subscribe‘ b‘[email protected]__:expired‘ 1
b‘message‘ b‘[email protected]__:expired‘ b‘test-name‘

Notice:

1.redis的key过期事件在获返回结果时是 key的值,所以在做相关任务时,可以把key名写成需要执行的函数名等等。

2.redis的key过期事件是通过发布订阅机制,如果在key过期发布触发事件时,没有订阅服务的话,此过期事件会被舍弃掉,也就是发布过期事件,但是无法判断是否被订阅到,并且不会保存此次过期事件。所以要时刻确保 订阅机制完好。

3.  sub_expire.subscribe(‘[email protected]__:expired‘) 中 [email protected]__: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

原文地址:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_692days.html

时间: 2024-10-08 11:53:03

redis中key过期事件的相关文章

Redis Sentinel环境下的Key过期事件消息订阅

一.Redis Sentinel Sentinel是Redis 2.8之后官方发布的HA解决方案,通过Sentinel可以保障整个Redis系统的高可用性.当Redis系统中的Master在异常情况下停止服务后,若干Sentinel会及时察觉并主观判断Master down(Subjectively Down),并且随后由一定数量的Sentinel共同确定Master确实客观已down(Objectively Down),这个时候Sentinel们会选举出一个新的Master继续提供服务.Red

Redis中Key相关的常用指令详解

Redis是一个开源的使用ANSI C 语言编写.支持网络.同memcache相比在Redis下可以实现基于内存亦可持久化的日志型.Key-Value 类型的NoSQL数据库,且在Redis中Key的类型也更为丰富.所以较为广泛的在生产环境中使用,在这里就说一说Redis中Key相关的常用指令. 首先,先要说明下在Redis下Key,Redis的key是字符串类型,但是key 中不能包括边界字符(""),由于key 不是binary safe的字符串,所以像"my key&q

redis中关于过期键的删除策略

我们已经了解到了Redis是一种内存数据库,Redis中数据都是以key-value的形式存储在内存中,由Redis服务器来维护和管理这部分内存,内存是何足珍贵,不需要的数据或者是已经使用过的没用的数据是不会让它长久的存在于内存中的,毕竟我们还是要建设节约型社会的.所以我们可以通过给键设置生存时间或者过期时间来权衡有限的内存和不断增长的数据,设置过期时间的命令为:[expire key 时间长度(秒)]或者是[pexpire key 时间长度(毫秒)] 同时也可以通过[expireat key

Redis big key过期导致应用超时

突然收到告警,提示redis挂了,同时大群也在说某某redis连接超时了,过了一会儿就恢复了.这时登上服务器,查看监控.首先看看qps: 可以看到qps并不高,但是中间有段时间没取到数据是怎么回事?那么继续看看redis的cpu使用率: 可以看到cpu已经饱和,这也就能解释为何断图了,因为redis是单线程,在使用cpu 100%以后,就无法处理其他的命令了,zabbix也就无法执行info命令取qps了.那么已经知道是cpu使用饱和造成的问题,那么到底是什么原因呢?那么继续查看,cpu使用高的

Redis的key过期处理策略

Redis中有三种处理策略:定时删除.惰性删除和定期删除. 定时删除:在设置键的过期时间的时候创建一个定时器,当过期时间到的时候立马执行删除操作.不过这种处理方式是即时的,不管这个时间内有多少过期键,不管服务器现在的运行状况,都会立马执行,所以对CPU不是很友好. 惰性删除:惰性删除策略不会在键过期的时候立马删除,而是当外部指令获取这个键的时候才会主动删除.处理过程为:接收get执行.判断是否过期(这里按过期判断).执行删除操作.返回nil(空). 定期删除:定期删除是设置一个时间间隔,每个时间

redis中key的归类

redis中可以使用前缀对key进行归类: 例如:key: ITEM_INFO:123456:BASE ITEM_INFO:123456:DESC 作用:方便进行管理 如果把二维表保存到redis中: 1.表名就是第一层 2.主键是第二层 3.字段名第三层 三层使用“:”分隔作为key,value就是字段中的内容. 原文地址:https://www.cnblogs.com/niuchuangfeng/p/10213448.html

redis中key键操作

keys */查看所有的key remoteSelf:1>select 0 "OK" remoteSelf:0>keys * 1) "SUBCRIBEMAP" 2) "test" exists key名字/判断某个key是否存在 # 不存在返回0 remoteSelf:0>exists aaa "0" # 存在返回1 remoteSelf:0>exists test "1" move

redis的key过期时间

public void set(String key,String value,int liveTime){ this.set(key, value); this.getJedis().expire(key, liveTime); } 通过设置key的淘汰时间来决定key的存储策略

redis中键空间通知

通过redis的键空间通知,当redis删除过期key的时候,及时更新mongodb数据库中user的状态 var Redis = require('ioredis'); var redis = new Redis(); redis.subscribe('[email protected]__:expired',function(err,count){}) //订阅key过期事件 redis.on('message',function(channel,message){ //对redis的操作的