登录进入redis-cli
客户端,执行:
config set notify-keyspace-events Ex
或者在redis.conf 添加配置:
notify-keyspace-events "Ex" //过期时间监听生效
或者通过代码设置:
# 连接redis库1 redisCli1 = StrictRedis(db=1, decode_responses=True) # 开启key过期通知功能 redisCli1.config_set("notify-keyspace-events", "Ex") # 清空库 redisCli1.flushdb()
字符 | 发送通知 |
---|---|
K | 键空间通知,所有通知以 keyspace@ 为前缀,针对Key |
E | 键事件通知,所有通知以 keyevent@ 为前缀,针对event |
g | DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知 |
$ | 字符串命令的通知 |
l | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合命令的通知 |
x | 过期事件:每当有过期键被删除时发送 |
e | 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送 |
A | 参数 g$lshzxe 的别名,相当于是All |
登录进入redis-cli 客户端,执行:( 订阅一个或者多个符合pattern格式的频道)
# 进入1库 redis-cli -n 1--raw # 订阅过期事件,*代表所有库 PSUBSCRIBE __keyevent@*__:expired
然后该客户端处于监听状态,如果有key过期,则列出:
from redis import StrictRedis import requests import sys import logging import logging.handlers logger = logging.getLogger('mylogger') logger.setLevel(logging.WARNING) # handler 输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.WARNING) logger.addHandler(ch) # redis try: # 开启key过期通知功能 redisCli1 = StrictRedis(db=1, decode_responses=True) redisCli1.config_set("notify-keyspace-events", "Ex") redisCli1.flushdb() except: logging.error("redis服务未启动!") sys.exit(0) # 对库1 进行监听 pubsub = redisCli1.pubsub() # 发布监听key失效的订阅 pubsub.psubscribe("__keyevent@1__:expired") # 通过无限循环等待事件 logger.info('Starting message loop') for data in pubsub.listen(): key = data.get("data") if key != 1: logger.warning("过期key是: %s", key)