使用redis key 过期通知,需开启key过期通知功能:
登录进入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 |
启动监听key过期
登录进入redis-cli 客户端,执行:( 订阅一个或者多个符合pattern格式的频道)
# 进入1库
redis-cli -n 1--raw
# 订阅过期事件,*代表所有库
PSUBSCRIBE __keyevent@*__:expired
然后该客户端处于监听状态,如果有key过期,则列出:
Python代码示例
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)