【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)
上一篇 2026年2月19日 下午12:43
下一篇 2026年2月19日 下午1:15


相关推荐

  • read函数的返回值问题

    read函数的返回值问题Read函数读取字符串返回值的问题1.前言在学习socket编程的途中,通过客户端给服务端发送字符串,然后服务端通过read或者recv来读取数据,然后返回读取的字节数.我在想read返回的读取字节数有没有包含’\0’或者’\n’呢,于是通过一些简单的小例子,来看看实际情况到底如何.2.read函数我们来看一下read函数的原型:ssize_tread(intfd,void…

    2022年6月22日
    98
  • sed -i命令详解及入门攻略

    sed -i命令详解及入门攻略sed i 命令详解 sed 入门详解教程 nbsp nbsp sed 是一个比较古老的 功能十分强大的用于文本处理的流编辑器 加上正则表达式的支持 可以进行大量的复杂的文本编辑操作 sed 本身是一个非常复杂的工具 有专门的书籍讲解 sed 的具体用法 但是个人觉得没有必要去学习它的每个细节 那样没有特别大的实际意义 网上也有很多关于 sed 的教程 我也是抱着学习的心态来学习 sed 的常见的用法 并进

    2026年3月20日
    2
  • kindle推送服务_kindle推送服务

    kindle推送服务_kindle推送服务微信是个好东西,信息量超大,正能量的东西居多,但信息过载的滋味也很不好受,浏览了一大堆铺天盖地的信息后,关上手机后大脑又重新回到空白。所以还是喜欢用RSS聚合功能,自己去订阅优秀的博客或新闻,当有更新

    2022年8月2日
    6
  • 【STM32】HAL库 STM32CubeMX教程三—-外部中断(HAL库GPIO讲解)

    【STM32】HAL库 STM32CubeMX教程三—-外部中断(HAL库GPIO讲解)前言上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了今天我们会详细的带你学习STM32CubeMX配置外部中断,并且讲解HAL库的GPIO的各种函数,带你学习不一样的STM32如果还没有配置过工程,请参看上一篇博客《STM32CubeMX教程二–基本使用(新建工程点亮LED灯)》那么话不多说,我们开…

    2022年6月11日
    105
  • 虚拟机 XP激活

    虚拟机 XP激活1.安装原版windowsxp2.打开注册表regedit3.找到主键Hkey_Local_Machine\Software\Microsoft\WindowsNT\CurrentVersion\WPAEvents\4.删除子键lastWPAEventLoged(如果有的话)5.修改子键OOBETimer键值为:ffd571d68b6a8d6fd…

    2022年8月16日
    6
  • srsLTE测试SDR频偏[通俗易懂]

    srsLTE测试SDR频偏[通俗易懂]1、在Android手机上使用网络信号大师确定当前连接基站的EARFCN。2、修改srsue的ue.conf中earfcn参数为手机连接的基站。3、启动srsue尝试接入,如果收不到基站或接入失败,可以调节ue.conf中的频偏(freq_offset)参数,可以从修改-15000到15000(可以5000为步进调节)不停重复尝试接入。4、能成功接入基站后,FoundCell信息中会有CFO参数,此参数即为频偏,然后再根据此值调试频偏值,频偏=频偏+CFO,比如CFO为-5.5k,频偏=频偏-

    2026年4月15日
    4

发表回复

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

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