redis开启过期监听

2023-11-16

java项目中,场景:订单没有付款到期取消订单,使用的是redis过期监听来做的,做个笔记!首先使用该功能需要下载2.8.0及以上的版本,这一部分详细内容可以访问redis官网:http://redis.io/topics/notifications ,以下是我总结的:

第一步:配置redis的过期失效监听,需要修改redis.conf配置文件,找到 EVENT NOTIFICATION (事件通知)这个配置
notify-keyspace-events "" 修改为 notify-keyspace-events "Ex"
在这里插入图片描述

参数解释,看配置文件或者官网都有详细解释,如下:

############################# EVENT NOTIFICATION ##############################

# 键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。
# 因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
# notify-keyspace-events 的参数可以是以下字符的任意组合,
# 它指定了服务器该发送哪些类型的通知:
# K 键空间通知,所有通知以 __keyspace@__ 为前缀
# E 键事件通知,所有通知以 __keyevent@__ 为前缀
# g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
# $ 字符串命令的通知
# l 列表命令的通知
# s 集合命令的通知
# h 哈希命令的通知
# z 有序集合命令的通知
# x 过期事件:每当有过期键被删除时发送
# e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
# A 参数 g$lshzxe 的别名
# 输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何 通知被分发。

第二步: 重新启动redis,没什么好说的,修改配置文件以及启动redis不会自行度娘

第三步:验证配置是否成功

  1. 运行redis客户端:
    redis-cli
  2. 选择你要监听的库 @后面的值,redis默认连接0号库,这里不做修改了,运行监听命令:
    psubscribe __keyevent@0__:expired
  3. 在启动一个客户端redis-cli,这里也是默认0号库,不做修改,设置一个10秒过期的key:
    SETEX mykey 10 redis
    拓展:Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。
  4. 10秒后,可以看到监听端口可以接收到失效的redis的key。如图
    在这里插入图片描述

springboot 项目集成ridis配置过期监听:

1.引入redis依赖,这块不做过多解释,不会的去搜集成reids


        <!--Spring boot Redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.创建两个类,第一个类配置 RedisListenerConfig 实现监听 Redis key 过期时间,我这里是监听所有db的过期事件__keyevent@*__:expired,根据自己的业务需求自行配置,@几号库,@*是所有
RedisListenerConfig:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

/**
 * @ClassName RedisListenerConfig
 * @Description redis监听配置
 * @Author cl
 * @Date 2021-09-09 10:45
 */
@Configuration
public class RedisListenerConfig {
    @Autowired
    RedisListen redisListen;

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory factory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(factory);
        container.addMessageListener(redisListen, new PatternTopic("__keyevent@*__:expired"));
        return container;
    }
}

第二个类,定义监听器 RedisListen,监听 Redis key 过期事件,针对 Redis 数据失效事件,进行业务处理
RedisListen:

import com.tanghe.common.constant.RedisConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;

/**
 * @ClassName RedisListen
 * @Description RedisListen
 * @Author cl
 * @Date 2021-09-09 10:46
 */
@Slf4j
@Component
public class RedisListen implements MessageListener {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiredKey = message.toString();

        log.info("失效的redis是:"+expiredKey);
        RedisSerializer<?> serializer = redisTemplate.getValueSerializer();
        String channel = String.valueOf(serializer.deserialize(message.getChannel()));
        String body = String.valueOf(serializer.deserialize(message.getBody()));
        log.info("channel==="+channel+"-----------------"+"body === "+body);
        //key过期监听,在处理业务之前校验下自己业务的key和监听的key以及库号
        if("__keyevent@0__:expired".equals(channel) && body.indexOf(“自己业务的key”) != -1){
            log.info("进来了哈");
            //这里写需要处理的业务

        }

    }
}

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

附redis常用指令,会持续更新!!!

windows

redis设置开机自启动:redis-server --service-install redis.windows-service.conf --loglevel verbose
redis启动命令:redis-server redis.windows.conf
redis卸载命令:redis-server --service-uninstall
redis启动服务命令:redis-server --service-start
redis停止服务命令:redis-server --service-stop
进入redis命令:redis-cli.exe -h 127.0.0.1 -p 6379
进入redis使用密码命令:redis-cli.exe -h 127.0.0.1 -p 6379 -a password

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis开启过期监听 的相关文章

随机推荐

  • Jupyter Notebook代码折叠插件教程

    默认安装完成的 Jupyter Notebook 是没有安装插件选项的 我们可以通过下面的方法安装插件 pip install jupyter contrib nbextensions pip install jupyter nbexten
  • 微信小程序请求的封装及跨域的解决。

    我这个是把所有请求都抽离到不同页面对应的js文件中 可以方便后期的修改和排查问题 第一步 新建api文件夹并创建config js文件配置公共信息 const baseURL http xxxxxxxxxxx 配置公共地址并暴露 expor
  • [日常]实现windows的本地定时备份文件夹

    虽然网上有一些免费的文件自动备份软件 但是没有自己编写一段批处理来完成备份任务来的放心 而且不用占用系统资源 就给大家讲一下如何利用批处理完成本地文件或者文件夹的备份 该方法可把某文件夹下的文件同步到另外的文件夹 可忽略已经存在的文件 可根
  • Can't use Subversion command line client:svn

    1 在Intellij IDEA里checkout东西时出先这个错误提示 Can t use Subversion command line client svn Subversion command line client version
  • 怎么将服务器文件移动到根目录,如何要移动的Nginx Web根目录移到新位置上的Ubuntu 16.04...

    介绍 在Ubuntu上 在默认情况下 Nginx的Web服务器中存储其文件 var www html 通常位于根文件系统与操作系统的其余部分 有时 尽管将文档根目录移动到其他位置 如单独安装的文件系统 很有帮助 例如 如果您从同一Nginx
  • trading view实现

    TradingView udf模式 近期k线更新 刚趟完坑 简单总结一下 第一步 申请tv 官网地址 https cn tradingview com 注 需以公司名义申请 第二步 相关资料 文档 https b aitrade ga bo
  • 特殊乘法。。

    题目描述 写个算法 对两个小于1000000000的输入 求特殊乘法的结果 特殊乘法举例 123 45 1 4 1 5 2 4 2 5 3 4 3 5 输入 两个小于1000000000的数 输出 输入可能有多组数据 对于每组数据 Inpu
  • vue学习笔记3——外部引入css和路由的一部分

    vue学习笔记3 外部引入css和路由的一部分 从外部引入css文件 在 vue文件中 后面加的scoped是H5新特性 可以锁定style的范围 此处这样写就是说引入的css只在当前的vue的主页生效 不加scoped的话 可能会影响其他
  • Hadoop的伪分布式的安装及部署

    文章目录 需要的软件及源码包 安装JDK Hadoop的部署安装 Hadoop的配置 Hadoop的使用 做Hadoop的伪分布式我们分为一下几个步骤
  • [SQL Server]从数据类型 nvarchar 转换为 numeric 时出错。 (8114)

    SQL Server 从数据类型 nvarchar 转换为 numeric 时出错 8114 解决方法 SELECT FROM TABLENAME L where TRY CONVERT decimal 18 2 COLUNNAME is
  • 2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策

    1 赛题 在生鲜商超中 一般蔬菜类商品的保鲜期都比较短 且品相随销售时间的增加而变差 大部分品种如当日未售出 隔日就无法再售 因此 商超通常会根据各商品的历史销售和需 求情况每天进行补货 由于商超销售的蔬菜品种众多 产地不尽相同 而蔬菜的进
  • Leetcode[数组] 买卖股票的最佳时机 -- 动态规划

    0 题目描述 leetcode原题链接 买卖股票的最佳时机 1 动态规划 假设给定的数组为 7 1 5 3 6 4 如果我们在图表上绘制给定数组中的数字 我们将会得到 我们来假设自己来购买股票 随着时间的推移 每天我们都可以选择出售股票与否
  • pycharm快速注释快捷键

    1 多行注释 用鼠标选中需要注释的代码 三次按下 shift 即可快速注释 2 单行注释 选中该行 按下 ctrl 即可单行注释
  • 【LeetCode】MySQL:数据库简单题(586 订单最多的客户)

    586 订单最多的客户 1 题目描述 2 具体实现 Write your MySQL query statement below 为下了最多订单的客户查找customer number 分组 排序 Limit select customer
  • 使用BiseNet从头训练&&微调自己的数据集

    一 代码链接 本次训练采用的是pytorch版本的BiseNet 代码链接为GitHub CoinCheung BiSeNet Add bisenetv2 My implementation of BiSeNet 二 数据格式 数据集分为原
  • Linux下安装Git

    文章目录 一 Git 安装 1 下载Git安装包 2 将Git安装包上传到服务器 3 解压Git安装包 4 安装Git所需依赖 5 编译与安装Git 6 设置环境变量 7 执行profile文件 使配置立即生效 一 Git 安装 如果觉得下
  • 笔记:几个基本数据结构——Ndarray、Series和Dataframe

    目录 一 Ndarray 1 创建 1 直接使用 np array创建 2 使用NumPy中函数 array func lt gt 2 索引 1 一维数组 array start end step 2 多维数组 3 基本操作 运算 操作 如
  • idea配置备份到GitHub

    目录 普通导入导出到本地 备份到GitHub 普通导入导出到本地 备份 File gt Export Settings 恢复 File gt Import Settings 2020版本 自定义Intellij idea配置和插件存放目录
  • CTP 穿透测试程序

    CTP穿透测试程序 修改配置文件后即可进行运行测试 方便简单 https download csdn net download someonemt5 11215587
  • redis开启过期监听

    java项目中 场景 订单没有付款到期取消订单 使用的是redis过期监听来做的 做个笔记 首先使用该功能需要下载2 8 0及以上的版本 这一部分详细内容可以访问redis官网 http redis io topics notificati