【SpringBoot】35、SpringBoot整合Redis监听Key过期事件「建议收藏」

【SpringBoot】35、SpringBoot整合Redis监听Key过期事件「建议收藏」在实际的开发项目中,监听key的过期事件,应用非常广泛,例如:订单超时未支付,优惠券过期等等一、修改Redis配置文件1、在Redis的安装目录2、找到redis.windows.conf文件,搜索“notify-keyspace-events”修改为“notify-keyspace-eventsEx”,这样我们的Redis就支持key过期事件的监听了二、注入redisMessageListenerContainer注意:本偏文章衔接与上篇文章:【Sprin

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在实际的开发项目中,监听 key 的过期事件,应用非常广泛,例如:订单超时未支付,优惠券过期等等

一、说明

本篇文章是继:
【SpringBoot】三十四、SpringBoot整合Redis实现序列化存储Java对象
其中涉及到的知识及代码,本篇文章不再进行赘述

二、修改 Redis 配置文件

  • 1、在 Redis 的安装目录
    配置文件
  • 2、找到 redis.windows.conf 文件,搜索 “notify-keyspace-events”

修改配置文件
修改为 “notify-keyspace-events Ex”,这样我们的 Redis 就支持 key 过期事件的监听了

三、注入redisMessageListenerContainer

注意:本偏文章衔接与上篇文章:【SpringBoot】三十四、SpringBoot整合Redis实现序列化存储Java对象,其中的配置信息本篇文章不在赘述

  • 1、还是在 RedisConfig.java 中注入一个 redisMessageListenerContainer 的Bean 用于监听
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) { 
   
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    // 监听所有库的key过期事件
    container.setConnectionFactory(connectionFactory);
    return container;
}
  • 2、创建监听类RedisKeyExpirationListener

我们需要创建监听 key 过期类,来实现当事件触发时的具体操作

package com.zyxx.common.redis;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/** * 监听 Redis key 过期事件 * * @Author Lizhou */
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { 
   

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

    /** * 针对 redis 数据失效事件,进行数据处理 */
    @Override
    public void onMessage(Message message, byte[] pattern) { 
   
        // 拿到key
        log.info("监听Redis key过期,key:{},channel:{}", message.toString(), new String(pattern));
    }
}

我们可以监听到过期的 key 的信息,以及通道的信息

  • 3、操作 API
RedisUtils 中加入如下操作

```java
/** * 写入数据,并设置过期时间 */
public boolean set(final String key, Object value, long time) { 
   
    if (StringUtils.isBlank(key)) { 
   
        return false;
    }
    try { 
   
        template.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        log.info("存入redis成功,key:{},value:{}", key, value);
        return true;
    } catch (Exception e) { 
   
        log.error("存入redis失败,key:{},value:{}", key, value);
        e.printStackTrace();
    }
    return false;
}

借助此方法,我们可以向 Redis 中存入数据,并设置过期时间,单位为:秒(S)

四、测试

  • 1、测试用例
package com.zyxx.redistest;

import com.zyxx.redistest.common.RedisUtils;
import com.zyxx.redistest.common.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
class RedisTestApplicationTests { 
   

    @Autowired
    private RedisUtils redisUtil;

    @Test
    void contextLoads() { 
   
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setName("jack");
        userInfo.setCreateTime(new Date());
        // 放入redis,并设置过期时间为5秒
        redisUtil.set("user", userInfo, 5);
    }
}

我们向 Redis 中存入了一个 key 为 “user”,value 为 UserInfo 对象的数据,并设置了过期时间为 5 秒

注意:在测试之前,我们需要启动我们的项目,才能将 Bean 注入到我们的容器中,监听事件才会生效

  • 2、测试结果
    存入数据
    可以看出我们的数据存入 Redis 成功

5秒后…

监听事件
触发了 key 过期事件,这时候,我们拿到过期的 key 就可以对应的做一些业务处理了

如您在阅读中发现不足,欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190513.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 读还是不读:that is the question

    点击上方☝,轻松关注!及时获取有趣有料的技术文章一个人只拥有此生此世是不够的,他还应该拥有诗意的世界。——王小波读书日今天是2020年的世界读书日,时间过的就是那么的快,不感概都不行!想…

    2022年2月28日
    56
  • java流程图平行四边形_流程图图形标准含义[通俗易懂]

    rectangle:矩形作用:一般用作要执行的处理(process),在程序流程图中做执行框。在Axure中如果是画页面框架图,那么也可以指代一个页面。你可把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形做色彩区别,然后做说明就好了。roundedrectangle:圆角矩形或者扁圆作用:表示程序的开始或者结束,在程序流程图中用作为起始框或者结束框。beveledrectang…

    2022年4月9日
    205
  • matlab中 meshgrid 函数的用法

    matlab中 meshgrid 函数的用法转自:https://blog.csdn.net/foreverhuylee/article/details/32731349meshgrid是MATLAB中用于生成网格采样点的函数。在使用MATLAB进行3-D图形绘制方面有着广泛的应用。函数功能生成绘制3-D图形所需的网格数据。在计算机中进行绘图操作时,往往需要一些采样点,然后根据这些采样点来绘制出整个图形。在进行3-D绘图操作时,涉及到x、…

    2022年5月1日
    61
  • 失眠食疗方_重度失眠7个偏方

    失眠食疗方_重度失眠7个偏方1.失眠食疗方21世纪的中国青少年基本上都是亚健康问题,而在众多身体问题的前置就是睡眠问题可以理解为:睡眠问题是万病之源(人体没时间修复)PS:经常熬夜、作息不规律睡眠就会慢慢变差(随着

    2022年8月2日
    6
  • 抖音视频下载爬虫编写的完整过程!爬取app的过程

    抖音视频下载爬虫编写的完整过程!爬取app的过程

    2022年3月7日
    43
  • 【csma/ca协议和csma/cd协议的matlab仿真详解】

    【csma/ca协议和csma/cd协议的matlab仿真详解】首先你的熟悉csma/ca协议,csma/cd协议;csma/ca协议:点击打开链接csma/cd协议:点击打开链接这个课题有几个难点部分:1.就是需要考虑各种情况,并对每一种情况都必须做出相应的处理。2.怎么展示,怎么简单、直观而有效的展示你的程序正确性。鉴于本程序我采用动态图形形式展示csma/ca协议的运行过程。以下是我程序的运行结果的部分展示:1…

    2025年7月25日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号