springboot使用Redis,监听Redis键过期的事件设置与使用代码

Easter79
• 阅读 737

我使用的是Windows下的Redis服务,所以一下Redis设置都是在Windows平台进行。

1、修改Redis配置文件

1.1:Windows下的Redis存在两个配置文件

springboot使用Redis,监听Redis键过期的事件设置与使用代码

修改带有service的配置文件才会有效。

打开配置文件,找到下面一行代码:

notify-keyspace-events ""

然后修改配置,如下图配置:

springboot使用Redis,监听Redis键过期的事件设置与使用代码

很简单,替换注释一下就好。

2、重启Redis服务

重启Redis服务有两种方式:

1、直接win+R,打开运行对话框,输入Services.msc,打开服务列表。然后找到Redis服务重启就好了。

2、打开cmd命令窗口,输入下面命令:

   redis-server --service-stop

springboot使用Redis,监听Redis键过期的事件设置与使用代码

关闭成功!!

3.打开cmd命令窗口,输入下面命令:

  redis-server --service-start

springboot使用Redis,监听Redis键过期的事件设置与使用代码

开启成功!!

3、在springboot项目中配置Redis配置

 我的项目使用的是springboot2.0.5,所以一下配置适用springboot2.0.5项目,其他版本没试过。

两种方式:

第一种:指定:__keyevent@0__:expired,监听指定的db键的过期事件。

Redis配置第一步:

/**
 * TODO Redis配置
 * @author zhuzhen
 * @date 16:20 2018/12/18
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * TODO 监听 Redis键过期事件
     * @author zhuzhen
     * @date 14:38 2018/12/21
     * @param connectionFactory
     * @return org.springframework.data.redis.listener.RedisMessageListenerContainer
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
        return container;
    }

}

Redis配置第二步:

实现MessageListener接口:

/**
 * @author zhuzhen
 * @version 1.0
 * @description TODO 自定义Redis过期监听事件
 * @className com.nongcai.rabbitmq.demo.redis.RedisExpiredListener
 * @date 2018/12/21 14:42
 */
public class RedisExpiredListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] bytes) {
        // 建议使用: valueSerializer
        byte[] body = message.getBody();
        byte[] channel = message.getChannel();
        //Redis数据的键
        String redisId = new String(body);

        System.out.println("onMessage >> " );
        System.out.println(String.format("channel: %s \n body: %s \n bytes: %s"
                ,new String(channel), new String(body), new String(bytes)));

    }
}

 第二种:监听所有的db键的过期事件。

Redis配置第一步:配置监听bean

/**
     * TODO 监听 Redis键过期事件
     * @author zhuzhen
     * @date 14:38 2018/12/21
     * @param connectionFactory
     * @return org.springframework.data.redis.listener.RedisMessageListenerContainer
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
//        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
        return container;
    }

Redis配置第二步:

/**
 * @author zhuzhen
 * @version 1.0
 * @description TODO 监听所有db的过期事件__keyevent@*__:expired"
 * @className com.nongcai.rabbitmq.demo.redis.RedisKeyExpirationListener
 * @date 2018/12/21 14:39
 */
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

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

    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
        System.out.println("message>>>  " + message);
        System.out.println("pattern>>>  " + new String(pattern));
        String expiredKey = message.toString();
        System.out.println("Redis的键:" + expiredKey);

    }
}

自此,监听Redis键过期事件配置完成。

spring关于Redis文章地址:https://spring.io/guides/gs/messaging-redis/

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Stella981 Stella981
3年前
SpringBoot使用RedisTemplate操作Redis时,key值出现 -xac-xed-x00-x05t-x00-tb
原因分析原因与RedisTemplate源码中的默认序列化方式有关defaultSerializernewJdkSerializationRedisSerializer(classLoader!null?classLoader:this.getClass().getClassLoader()
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Easter79 Easter79
3年前
SpringBoot使用RedisTemplate操作Redis时,key值出现 -xac-xed-x00-x05t-x00-tb
原因分析原因与RedisTemplate源码中的默认序列化方式有关defaultSerializernewJdkSerializationRedisSerializer(classLoader!null?classLoader:this.getClass().getClassLoader()
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k