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


Posted in Redis onSeptember 04, 2021

Redis 过期监听场景

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

redis配置

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

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

项目demo工程

项目结构如下图

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

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实现延迟通知功能(Redis过期键通知)的文章就介绍到这了,更多相关Redis过期键通知内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
详解Redis在SpringBoot工程中的综合应用
Oct 16 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
使用Redis做预定库存缓存功能
Apr 02 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
Redis实现短信验证码登录的示例代码
Jun 14 Redis
redis protocol通信协议及使用详解
Jul 15 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 #Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 #Redis
基于Redis的List实现特价商品列表功能
Aug 30 #Redis
Redis 常见使用场景
Aug 30 #Redis
Redis入门教程详解
Redis如何实现分布式锁
Aug 23 #Redis
Redisson实现Redis分布式锁的几种方式
You might like
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
angular 实现下拉列表组件的示例代码
2019/03/09 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
python实现的udp协议Server和Client代码实例
2014/06/04 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Python中安装easy_install的方法
2018/11/18 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
python2 对excel表格操作完整示例
2020/02/23 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
pandas数据处理之绘图的实现
2020/06/15 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
社区务虚会发言材料
2014/10/20 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA