Redis过期键通知(使用redis来实现延迟通知)

redis 过期消息订阅实现(java实现) 上面 Ex 就是其中的关键字之一K:keyspace事件,事件以__keyspace@__为前缀进行发布E:keyevent事件,事件以__keyevent@__为前缀进行发布g:一般性的,非特定类型的命令,比如del,expire,rename等$:字符串特定命令l:列表特定命令s:集合特定命令h:哈希特定命令z:有序集合特定命令x:过期事件,当某个键过期并删除时会产生该事件e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件。 阅读详情

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的键过期策略。

用 Redis 做一个可靠的延迟队列 我们先看看以下业务场景:当订单一直处于未支付状态时,如何及时的关闭订单,并退还库存?新创建店铺,N天内没有上传商品,系统如何知道该信息,并发送激活短信?上述场景最简单直接的解决方案是定时扫表。我们假设 10 分钟未支付则关闭订单、定时任务设置为 5 分钟一次,那么一个订单最晚会在 15 分钟关闭。高达 5 分钟的误差是业务难以接受的。另一方面频繁的扫表可能消耗过多数据库资源,影响线上交易吞吐量。此外还有朋友使用 Redis 的过期通知、时间轮、Java 的DelayQueue等方式实现延时任务。... 阅读详情

相关推荐

使用Redis如何实现延迟任务?

延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。延迟任务的常见使用场景有以下几个:1、定时发送通知或消息:发送定时短信、邮件或应用内消息,如注册确认、订单状态更新、促销活动通知等。定时推送新闻、天气预报、股票价格等实时信息。2、异步处理和后台任务:将耗时的操作安排为延迟任务,避免阻塞主线程或用户界面,提高系统的响应性能。执行批量数据处理,如日志分析、数据报表生成等。

胸纳甲兵,烽烟起可靖疆晏海。 1335

Redis 的过期提醒功能

Redis 的过期提醒功能通过发布/订阅系统实现,允许客户端在键过期或被驱逐时接收通知。要使用此功能,需要配置选项并订阅相关事件频道。这对于需要跟踪键的生命周期和管理缓存失效等场景非常有用。

m0_54187478的博客 2922

Redis实现延迟任务的操作流程

延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。发送定时短信、邮件或应用内消息,如注册确认、订单状态更新、促销活动通知等。定时推送新闻、天气预报、股票价格等实时信息。将耗时的操作安排为延迟任务,避免阻塞主线程或用户界面,提高系统的响应性能。执行批量数据处理,如日志分析、数据报表生成等。缓存管理和过期处理:定时清理过期的缓存数据,释放存储空间。更新缓存中的数据,保持数据的时效性和准确性。

wjianwei666的专栏 954

Redis key 过期通知

默认 notify-keyspace-events "" 修改为:notify-keyspace-events Ex。//通知效果如图 RedisKeyExpirationListener.onmessage。只有当key被删除时候 才会通知 并不是在key过期后就马上删除的。

只为成功找方法 不为失败找借口 1469

使用Redis 实现延迟任务

延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。

wjianwei666的专栏 419

SCHUNK SVH五指灵巧手 | 熵洛智能

雄克仿真五指机械手产品系列可以如人手操作那般完美地完成抓取操作。电子装置完全集成于腕关节中,使五指机械手几乎可以完成所有的人体手部动作。凭借带有9个驱动器的运动指骨,机械手可高精度地 执行多种抓取操作。富有弹性的抓取表面确保了对物体的可靠抓取。除了开启抓取和操作任务的全新领域之外,雄克还为在五指机械手的手势基础上进行人与机器人的交流开创了无限可能。编辑切换为居中添加图片注释,不超过 140 字(可选)产品特点:机械手有左手或右手两种版本适合移动应用耗能低,使用 24 V DC 在腕关节处完整集成了控制、调节

ShannonTech的博客 1331

Springboot+Redis实现过期键通知(订单超时取消方案总结)

背景 需求需要实现 订单15分钟超时未支付自动关闭 调研实现方案 基于java DelayQueue 缺点: 单机、不能持久化、宕机任务丢失等等; 定时任务全表扫描

念念不忘,必有回响 9666

保姆级教程:用YOLOv8/9/10搞定仪表盘指针识别,附完整数据集和Python环境配置

本文提供了一份基于YOLOv8/v9/v10的仪表盘指针检测全流程指南,涵盖环境配置、数据集构建、模型选型、训练调优和部署落地等关键步骤。通过详细的代码示例和实战经验,帮助开发者高效解决工业视觉中的仪表盘检测难题,特别适合电力巡检、智能监控等应用场景。

weixin_29031057的博客 1335

Redis实现延迟任务的几种方案

延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。Redis 本身并没有直接提供延迟任务的功能,但可以通过一些策略和手段,在 Redis 中手动实现延迟任务。

qq_35716689的博客 2万+

llama factory

NOTE] 除上述链接以外的其他网站均为未经许可的第三方网站,请小心甄别。

thesky123456的博客 1273

lift off工艺为什么常用蒸发的方式镀膜?

电子束蒸发中,蒸发物质从源头直接升华并沿直线路径沉积到晶圆上,它可以避免金属在掩模侧壁的覆盖,只在表面进行沉积。在镀膜结束后,在进行光刻胶剥离时,去胶液无法与光刻胶接触反应,导致光刻胶剥离很困难。欢迎加入我的半导体制造知识星球社区,目前社区有1900人左右。我观察到晶圆厂中lift off工艺,镀膜都是用的电子束蒸发的方式,很少有用磁控溅射的方式,为什么?需要增加撕胶工序,将胶面上覆盖的膜层撕掉,使光刻胶露出,这样才容易剥离。上图为磁控溅射的膜层截面图,去胶液很难突破侧壁膜层,进行反应。

1685

面试官:Redis如何实现延迟任务?

本文内容已收录至我的面试网站:www.javacn.site延迟任务(Delayed Task)是指在未来的某个时间点,执行相应的任务。也就是说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。延迟任务的常见使用场景有以下几个:定时发送通知或消息:发送定时短信、邮件或应用内消息,如注册确认、订单状态更新、促销活动通知等。定时推送新闻、天气预报、股票价格等实时信息。异步处理和后台...

磊哥聊Java 1041

第四节、C# 上位机面向对象编程详解(工控硬件继承实战版)

继承核心价值:在 C# 上位机工控开发中,继承的核心是通用逻辑复用与接口统一,将所有硬件的通用属性 / 方法封装到抽象基类,子类只需实现独有逻辑,大幅减少冗余代码。基类设计要点:优先使用抽象基类,合理分配访问修饰符(privateprotectedpublic),定义通用事件与虚方法,提供资源释放机制,兼顾复用性与扩展性。子类设计要点:通过: base()调用基类构造函数,强制实现抽象方法(保证接口统一),选择性重写虚方法(实现独有逻辑),复用基类的protected成员。多设备管理。

kylezhao2019的博客 784

3招搞定!Redis如何高效实现延迟任务?

延迟任务(Delayed Task)是指在未来的某个时间点执行的任务。换句话说,延迟任务是一种计划任务,它被安排在特定的时间后执行,而不是立即执行。通过本文的详细介绍,我们学会了如何使用 Redis 实现延迟任务,包括使用过期键的事件通知、使用 ZSet 和使用 Redisson 内置的延时队列。希望这篇文章能帮助你在面试中轻松应对这类问题,让你的数据管理更加得心应手!😄如果你有任何问题或建议,欢迎在评论区留言交流!😊。

java专栏 1877

【Rcode】生存分析: KM & COX回归& 随机森林& nomogram

本文使用了R——survival包下的lung数据进行方法测试: 1)KM 2) Cox回归:多因素 3)随机森林因子(根据cox回归结果) 4)nomogram ( 根据cox回归结果,建立了中位生存时间,1年5年生存率的概率计算) -------------------????????‍♀️本文只有干货,非常干!????----------------------------- 一、数据加载 #生存分析 library("survival") library("survminer") data("

weixin_43172152的博客 9273

RK平台内核“大瘦身”:从4GB到500MB的蜕变之旅

摘要:本文详细介绍了RK平台内核裁剪的完整流程与技术要点。通过对RK3568/RK3588等SoC平台的分析,探讨了从初始4GB内核精简至500MB的具体方法。文章系统阐述了前期硬件环境搭建、软件工具准备、SDK源码获取等准备工作,深入解析了内核模块组成及可裁剪部分,并提供了图形化配置界面的详细操作指南。同时,对编译烧录过程和常见问题解决方案进行了说明,强调了备份和谨慎选择裁剪项的重要性。最后展望了内核裁剪技术在物联网和边缘计算等领域的应用前景,为开发者提供了实用的内核优化参考方案。(148字)

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 441

redis应用篇----延时通知

当你有延迟通知这种类似的需求的时候,可能最先想到的是定时器,但是定时器这种实现是极其的不友好他会使你的pod变为有状态的,今天使用redis来实现这一功能----延时通知

qq_40223554的博客 3万+

一套C#接口通吃安川/发那科/库卡:工业机器人统一控制框架设计与产线踩坑实录

我们把机器人的通用能力抽象为接口,涵盖连接、运动、IO、寄存器、状态、报警六大类能力,所有品牌适配器都必须实现这个接口。/// 工业机器人统一控制接口// 基础连接// 运动控制// IO与寄存器// 状态与报警// 事件工业机器人统一控制框架的本质,不是把所有品牌的功能都做平,而是找到通用能力的最大公约数,通过分层抽象把品牌差异隔离在底层。上层业务只关注工艺和流程,不需要关心机器人是什么品牌、用什么SDK、通信协议是什么。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 401

Redis实现延迟队列的方案总结

Redis实现延迟队列的方案总结

weixin_42113716的博客 330

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis过期键监听

在 Redis 中,为了监听过期键事件,需要使用 Redis 的功能。这一功能允许客户端订阅某些事件的发生,比如键过期、键删除等。

Mamba Out 2218

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Redis是如何处理过期键的

Redis在不同版本中处理过期键的机制总体一致,主要包含以下三种策略:惰性删除、定期删除和内存淘汰策略。以下是Redis处理过期键的详细介绍及各版本的相关变化:1. 基本机制Redis的键过期时间处理方式包含以下两种主要策略:(1)惰性删除(Lazy Deletion)机制:仅在尝试访问一个键时,Redis会检查其是否过期。如果过期,则在访问时删除键。优点:不需要额外的后台资源,节省CPU开销...

qq_38862257的博客 1050

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于redis实现延迟队列

延时队列、大量key过期、过期删除策略

m0_73866527的博客 2041

用了这么久的redis,第一次知道这个骚操作 - Redis过期键监听实现方案(粘贴即用)

用了这么久的redis,第一次被同事念叨说有监听过期,想了一些骚操作写进项目了,用监听redis过期数据,防止redis数据没了,被频繁情况数据导致响应时间拉长。并且面试再被问到还redis缓存击穿的的另类解决方案。

Lxx794903137的博客 829

Redis过期键

Redis过期键存储: 命令:expire key seconds 存储时未过期:往expire库中添加/或者替换一条expires[key]:timeout数据 此时数据库中存在两条关于这条key的信息: dict------dict[key]:value expires--expires[key]:timeout redis过期键的删除策略: 1惰性删除策略:

bx409027377的专栏 864

使用Redis来实现延迟

使用Redis来实现延迟 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.r

baidu_41634343的博客 280

【Redis】过期键删除策略,LRU和LFU在redis中的实现,缓存与数据库双写一致性问题,go案例

Redis 的过期键清除策略采用了惰性删除 + 定期删除的组合策略,在保证较低 CPU 开销的同时,尽可能释放内存空间。惰性删除是只在访问key的时候检查是否过期;定期删除定时进行部分key的过期检查;Redis 放弃了定时删除,是因为对每个key单独计时过期删除,会大大增加cpu负担LRU,全称,即「最近最少使用」策略,用于在内存满时淘汰最久未被访问的键。LFU,全称,即「最不常访问」策略。用于淘汰访问次数最少的键,更能避免短期热点带来的缓存污染。场景推荐方案优点需注意问题与优化点。

m0_74282926的博客 1543
上一篇: Redis的五种数据类型
下一篇: Redis的分布式锁实现方案
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值