首页 > 数据库 >Redis中监听key过期通知

Redis中监听key过期通知

时间:2024-04-03 19:22:54浏览次数:9  
标签:commands 过期 redis Redis events key 监听

前言

正常情况下,我们是不需要监听 key 是否过期的,毕竟项目中 key 数量可能成千上万,要监听的话很耗费服务器资源。但是如果项目中 key 数量很少,且我们要在指定 key 过期时告警,这种场景下就是合适的。

使用

服务器开启配置

redis.conf 文件

notify-keyspace-events Ex

默认配置为 "",表示未开启,Ex 表示 key 过期通知。

K     Keyspace events, published with __keyspace@<db>__ prefix.(键空间通知)
E     Keyevent events, published with __keyevent@<db>__ prefix.(键事件通知)
g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...(通用命令(非类型特定的),如DEL、EXPIRE、RENAME)
$     String commands(字符串命令)
l     List commands(列表命令)
s     Set commands(集合命令)
h     Hash commands(哈希命令)
z     Sorted set commands(有序集合命令)
x     Expired events (events generated every time a key expires)(过期事件(每次密钥过期时生成的事件))
e     Evicted events (events generated when a key is evicted for maxmemory)(驱逐事件(当为maxmemory退出一个键时生成的事件))
t     Stream commands(Stream命令)
d     Module key type events(模块key类型事件)
m     Key-miss events (Note: It is not included in the 'A' class)(Key-miss事件(当访问不存在的键时通知,不包含在A中))
A     Alias for g$lshzxetd(g$lshzxetd的别名都可用A表示), so that the "AKE" string means all the events(Except key-miss events which are excluded from 'A' due to their unique nature)(用“AKE”可表示所有事件通知,除了特殊的Key-miss事件)

代码配置

在 SpringBoot 项目中使用

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
  redis:
    host: ip
    port: 6379
    password: xxx

具体代码如下

@Configuration
public class RedisConfig {

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
        // redis 消息订阅(监听者)容器
        RedisMessageListenerContainer messageListenerContainer = new RedisMessageListenerContainer();
        messageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return messageListenerContainer;
    }

    @Bean
    public CustomRedisKeyExpirationListener customRedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        return new CustomRedisKeyExpirationListener(listenerContainer);
    }

    public static class CustomRedisKeyExpirationListener extends KeyExpirationEventMessageListener {

        public CustomRedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
            super(listenerContainer);
        }

        @Override
        protected void doHandleMessage(Message message) {
            String expiredKey = message.toString();
            System.out.println("监听到过期key: " + expiredKey);
        }
    }
}

通过 继承 KeyExpirationEventMessageListener 来实现,如果我们服务器没有配置 notify-keyspace-events,spring 会自动配置其值为 EA,具体参考 KeyspaceEventMessageListener 的 init() 方法。

监听器的底层原理为 redis 的发布订阅功能,当有 key 过期时,会向 keyevent@*:expired 这个 topic 发送消息,我们客户端监听此 topic,得到过期的 key,做相应的处理。

参考

Redis key过期监听
Redis键空间通知(Keyspace Notifications)
Redis键空间通知

标签:commands,过期,redis,Redis,events,key,监听
From: https://www.cnblogs.com/strongmore/p/18026444

相关文章

  • 工作中使用Redis的10种场景
    工作中使用Redis的10种场景 前言Redis作为一种优秀的基于key/value的缓存,有非常不错的性能和稳定性,无论是在工作中,还是面试中,都经常会出现。今天这篇文章就跟大家一起聊聊,我在实际工作中使用Redis的10种场景,希望对你会有所帮助。1.统计访问次数对于很多官方网站的首页,经......
  • Redis连接超时排查实录
    记一次Redis超时关键字:#spring-data-redis、#RedisTemplate、#Pipeline、#Lettucespring-data-redis:2.6.31现象时间轴(已脱敏)day01线上发现接口耗时不正常变高day02其他接口mget操作偶现超时,陆续发现其他Redis命令也偶尔出现超时(持续半个月)day03排查Redis无慢查询,连接......
  • 蓝牙BLE开发——如何实时监听蓝牙适配器状态变化及回调
    uniapp监听蓝牙适配器状态变化事件近年来开发项目中接触比较多的与硬件设备对接,通过蓝牙与设备通讯;开发App、微信小程序,今天分享其中如何监听蓝牙适配;近期比较忙,不定时更新,有时间会分享uniapp开发蓝牙项目的Demo,个人分享,仅供参考。如何实时监听手机蓝牙状态变化并......
  • Redis作为微服务共享缓存的优缺点
    1.引言随着微服务架构的流行,越来越多的系统采用了微服务架构来构建应用程序。在微服务架构中,服务之间需要进行通信和协调,而这些服务通常需要共享一些数据,比如缓存数据。在这种情况下,Redis成为了一个非常受欢迎的选择。然而,使用Redis作为微服务架构中的共享缓存也会带来一些问题......
  • zookeeper监听集群节点的实现zkclient组件实现方案(Java版)
    ZooKeeperWatcher机制client向zookeeper注册监听client注册的同时会存储一个WatchManager对象向zookeeper发生改变则notificationclient并发送一个WatchManager对象,然后client再更新该对象packagecom.jacky.zk.demo;importorg.I0Itec.zkclient.IZkChildListen......
  • NoSQL之Redis配置与优化
    目录一.关系数据库与非关系数据库1、关系型数据库2、非关系型数据库非关系型数据库产生背景3、关系型数据库和非关系型数据库区别: 数据存储方式不同扩展方式不同对事务性的支持不同总结:二、Redis简介Redis具有以下几个优点 三、Redis安装部署​编辑 四、Re......
  • 简单的redis分布式锁实现
    简单的redis分布式锁实现1.需求我们公司想实现一个简单的分布式锁,用于服务启动初始化执行init方法的时候,只执行一次,避免重复执行加载缓存规则的代码,还有预防高并发流程发起部分,产品超发,多发问题。所以结合网上信息,自己简单实现了一个redis分布式锁,可以进行单次资源锁定,排......
  • 基于CMDKEY的方式修改用户凭据
    1、通过CMD方式在Windows中,凭据是指用户登录系统时的用户名和密码。在CMD中,可以使用cmdkey工具来添加、删除或更新凭据。例如,要添加新的凭据以连接到远程资源,可以使用以下命令:cmdkey/add:TargetName/user:Username/pass:Password这里的TargetName是远程资源的名称,......
  • keycloak~在认证的action中自定义重定向地址
    场景与实现逻辑我的登录接口,在输入账号密码成功后进行中间页中间页可以通过添加Authenticator的实现类来写逻辑authenticate方法是渲染页面的,action方法是提交表单后的逻辑context.success()方法表示认证成功,将进行重写向操作可以通过Response.status(302).header(HttpHeade......
  • 【Redis】.Net Core 面试破冰
    目录1.Redis简介2.使用场景3.C#具体使用介绍(Nuget)StackExchange.RedisFreeRedisNewLife.RedisServiceStack.Redis(收费)4.Redis常用面试问题以及回答5.建议及经验分享建议Redis经验分享ShareFlow1.Redis简介Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持......