Redis key过期事件的监听 ﹏ヽ暗。殇╰゛Y 2022-09-12 10:55 170阅读 0赞 ## 使用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() ### 配置详解: ### <table> <thead> <tr> <th>字符</th> <th>发送通知</th> </tr> </thead> <tbody> <tr> <td>K</td> <td>键空间通知,所有通知以 keyspace@ 为前缀,针对Key</td> </tr> <tr> <td>E</td> <td>键事件通知,所有通知以 keyevent@ 为前缀,针对event</td> </tr> <tr> <td>g</td> <td>DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知</td> </tr> <tr> <td>$</td> <td>字符串命令的通知</td> </tr> <tr> <td>l</td> <td>列表命令的通知</td> </tr> <tr> <td>s</td> <td>集合命令的通知</td> </tr> <tr> <td>h</td> <td>哈希命令的通知</td> </tr> <tr> <td>z</td> <td>有序集合命令的通知</td> </tr> <tr> <td>x</td> <td>过期事件:每当有过期键被删除时发送</td> </tr> <tr> <td>e</td> <td>驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送</td> </tr> <tr> <td>A</td> <td>参数 g$lshzxe 的别名,相当于是All</td> </tr> </tbody> </table> ## 启动监听key过期 ## 登录进入redis-cli 客户端,执行:( 订阅一个或者多个符合pattern格式的频道) # 进入1库 redis-cli -n 1--raw # 订阅过期事件,*代表所有库 PSUBSCRIBE __keyevent@*__:expired 然后该客户端处于监听状态,如果有key过期,则列出: ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA6Ziz5a6X5b63_size_19_color_FFFFFF_t_70_g_se_x_16] ## 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) [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBA6Ziz5a6X5b63_size_19_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/3adcdff169e447fca64709039987e17f.png
还没有评论,来说两句吧...