Redis过期键通知(使用redis来实现延迟通知)_java redis延时调用通知-程序员宅基地

技术标签: java  数据库  redis  

Redis 过期监听场景

业务中有类似等待一定时间之后执行某种行为的需求 , 比如 30 分钟之后关闭订单 . 网上有很多使用 Redis 过期监听的 Demo

redis配置

把notify-keyspace-events Ex 这一行的注释打开

在这里插入图片描述

项目demo工程

项目结构如下图
在这里插入图片描述

maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>kim-redis</artifactId>
        <groupId>com.kim</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>kim-redis-expiration-notice</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

    </dependencies>
</project>

配置文件

server:
  port: 20103

spring:
  redis:
    #数据库索引
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
    lettuce:
      pool:
        #最大连接数
        max-active: 8
        #最大阻塞等待时间(负数表示没限制)
        max-wait: -1
        #最大空闲
        max-idle: 8
        #最小空闲
        min-idle: 0
    #连接超时时间
    timeout: 10000

启动类

/**
 * @Project: kim-redis
 * @PackageName: com.kim.redis.expiration.notice
 * @FileName: NoticeApplication.java
 * @Description: The NoticeApplication is...
 * @Author: kimwu
 * @Time: 2020-12-19 14:01:56
 */
@SpringBootApplication
public class NoticeApplication {
    

    public static void main(String[] args) {
    
        SpringApplication.run(NoticeApplication.class, args);
    }

}

配置类

@Configuration
public class RedisTimeoutConfiguration {
    

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
    
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }

    @Bean
    public KeyExpiredListener keyExpiredListener() {
    
        return new KeyExpiredListener(this.redisMessageListenerContainer());
    }
}

监听类

@Slf4j
public class KeyExpiredListener extends KeyExpirationEventMessageListener {
    


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

    @Override
    public void onMessage(Message message, byte[] pattern) {
    
        String channel = new String(message.getChannel(), StandardCharsets.UTF_8);
        //过期的key
        String key = new String(message.getBody(), StandardCharsets.UTF_8);
        log.info("redis key 过期:pattern={},channel={},key={}", new String(pattern), channel, key);
    }
}

异常情况测试

当key过期时,项目宕机了
①写入redis的key
②手动关停服务,等待redis的key过期
③确认redis的key过期后,重启服务。服务不会收到通知

当key过期时,redis服务宕机了
①写入redis的key
②关停redis服务,等待redis的key过期
③启动redis服务,发现redis的过期key已经不存在了,服务没有收到通知

结论

redis的键过期本身不可靠,并不像rabbitmq一样保证了可靠性。
当服务本身宕机或者redis宕机时,将无法保证过期的key能够被消费。

当使用场景对数据完整性不那么精确时,可以使用redis的键过期策略。否则不太建议使用redis的键过期策略。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JavaTeachers/article/details/120039231

智能推荐

解决树莓派鼠标延迟/迟滞问题-转CSDN博主“Deiki”-sunziren-程序员宅基地

文章浏览阅读450次。本文转自CSDN:https://blog.csdn.net/deiki/article/details/73252942,因为我在为树莓派安装2.4G无线键鼠的时候,鼠标反应很慢,卡顿严重(换成有线鼠标就好了,而且这个无线鼠标在win10上面是正常的),最终按着这位兄弟的办法,解决了,为了记住这个解决方法,特此转到我的博客。  之前在树莓派上试了几款鼠标..._树莓派2.4g鼠标速度如何调节

基于SVM(支持向量机)对鸢尾花进行分类_鸢尾花svm分类-程序员宅基地

文章浏览阅读9.5k次,点赞9次,收藏147次。支持向量机方法也是一种强大的机器学习分类方法。在感知器算法中,我们的目标是最小化分类误差,而在SVM中,我们的优化目标是最大化分类间隔。较大的分类间隔意味着模型有较小的泛化误差,较小的间隔则意味着模型可能会过拟合。在SVM中的两条平行的决策边界为:w0+wTxpos=1w_0+\bm{w}^T\bm{x}_{pos}=1w0​+wTxpos​=1w0+wTxneg=−1w_0+\bm{w}^T\bm{x}_{neg}=-1w0​+wTxneg​=−1两式相减可得:wT(xpos−xne_鸢尾花svm分类

RecyclerView添加footerview-程序员宅基地

文章浏览阅读1.7k次。class FooterViewAdapter :RecyclerView.Adapter<RecyclerView.ViewHolder>() { companion object { const val TYPE_FOOTER: Int = 1 const val TYPE_NORMAL: Int = 0 } var isFooterView: Boolean = false fun setFooterView() { _recyclerview添加footerview

Android的R文件出错问题_android的r报错-程序员宅基地

文章浏览阅读994次。R文件生成不了_android的r报错

HTML5中的拍照和摄像是如何实现的?底层原理是什么?_html5拍照-程序员宅基地

文章浏览阅读232次。您可以使用这些数据来创建视屏元素()和音频元素(),并在网页上实时显示视频和音频。此外,您还可以使用 MediaStream API 来进行视频和音频的处理,例如截取视频、拍照等操作。在实际应用中,拍照和摄像通常需要一些额外的库和技术来实现,例如 Canvas、WebRTC 等。通过这些库和技术,您可以将摄像头捕捉的视频流转换为图像数据,并在网页上显示和处理。这个 API 可以让网页直接访问用户的摄像头和麦克风,并且在网页中进行视频和音频的处理。_html5拍照

初识Spring框架(干货版)_spring的前端怎么写-程序员宅基地

文章浏览阅读1.6k次。SpringSpring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。Spring : 春天 —> 给软件行业带来了春天2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。理念使现有技术更加实用 . 本身就是一个大杂烩 _spring的前端怎么写

随便推点

超文本标记语言是指Java_超文本标记语言(HTML)-程序员宅基地

文章浏览阅读1.9k次。超文本标记语言(HyperText MarkUp Language,HTML)HTML是用来制作网页的标记语言,HTML不需要编译,直接由浏览器解析;HTML文件是一个文本文件,包含了一些HTML元素, 标签等;HTML文件必须使用html或htm为文件名后缀;HTML是大小写不敏感的,HTML与html是一样的。HTML超文本标记语言,通过使用标记来描述文档结构和表现形式的一种语言,由浏览器进行..._java超文本标记语言转义

qmake qt工程用vs打开时出现 LNK1104: 无法打开文件“uiAccess=‘false‘ /MANIFESTDEPENDENCY:ty_无法打开文件“uiaccess='false-程序员宅基地

文章浏览阅读975次。说明LNK1104: 无法打开文件“uiAccess='false' /MANIFESTDEPENDENCY:ty 对于此类型问题现实可能各种原因导致,我目前提供的并不能解决每一位所产生的问题,勿怪。平台:vs2015 - qt5.7.1将通过 qmake -tp vc xxx.pro 产生xxx.vcxproj 通过vs2019打开 并选择对应的工具集编译时,出现LNK1104: 无法打开文件“uiAccess=‘false’ /MANIFESTDEPENDENCY:ty解决方案打开_无法打开文件“uiaccess='false

SODBASE CEP学习(十一):分布式集群_哪个分布式计算框架支持cep操作-程序员宅基地

文章浏览阅读869次。大家装SODBASE CEP Server的时候会发现,它本身就是一个分布式系统,可以非常方便的快速建立分布式运算模型。1. 启用集群方法只要修改sodbase-cep-server-webservice-1.0.1/configuration/configuration/db.properties即可。所有的计算服务器共享了一个状态服务器State Server,也就是db.proper_哪个分布式计算框架支持cep操作

Spring Cloud添加config配置中心_springcloud 启动添加配置项-程序员宅基地

文章浏览阅读1.7k次。SpringCloud做为一个微服务框架,当应用越来越多,每个应用的配置都单独在自己应用的目录下,这样如果修改起来确实有很多不便,分布式配置中心组件spring cloud config帮助解决客户端配置统一管理,这些配置可以放到svn,git,方便而且高效。配置中心有两个地方,一个是中心,一个是使用者,即server和client。这里把配置文件了放到了git,如图所示:…/spring..._springcloud 启动添加配置项

Unity塔防游戏学习(三)_码农家园unity塔防游戏学习-程序员宅基地

文章浏览阅读335次。摄像机摄像机由上到下俯视游戏场景,按住鼠标左键并移动可以移动摄像机的位置。1、设置观察点1、创建一个空的游戏体作为摄像机观察的目标点。2、创建CameraPoint.cs脚本。它的代码为。using System.Collections;using System.Collections.Generic;using UnityEngine;public class CameraPoint : MonoBehaviour{ public static CameraPoint ins_码农家园unity塔防游戏学习

设计函数fun,判断一对整数中第二个整数是否为第一个整数的倍数。要求定义fun如下: int fun(int,int);//满足条件返回1,否则返回0 在主函数中输入一系列整数对,并将是倍_本关任务:设计函数 fun,判断一对整数中第二个整数是否为第一个整数的倍数。-程序员宅基地

文章浏览阅读5.8k次,点赞10次,收藏20次。#includeusing namespace std;int fun(int, int);int main(){int x,y;while(1) {cout<<“输入第1个数:”;cin>>x;if(!x)break;cout<<"输入第2个数: ";cin>>y;if(fun(x, y))cout<<x<<’ t’ <<y<<endl;else cout<<"不满足条件!_本关任务:设计函数 fun,判断一对整数中第二个整数是否为第一个整数的倍数。

推荐文章

热门文章

相关标签