Redis key过期事件的监听

使用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过期,则列出:

Redis 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)

上一篇:优雅地记录Python程序日志1:logging模块简介(转载)


下一篇:springboot-log4j启动异常(java.lang.AbstractMethodError)