使用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 相关文章推荐
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
详解Redis主从复制实践
May 19 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
Redis 彻底禁用RDB持久化操作
Jul 09 Redis
Redis性能监控的实现
Jul 09 Redis
redis 存储对象的方法对比分析
Aug 02 Redis
Redis读写分离搭建的完整步骤
Sep 14 Redis
Redis三种集群模式详解
Oct 05 Redis
详解redis在微服务领域的贡献
Oct 16 Redis
浅谈Redis 中的过期删除策略和内存淘汰机制
Apr 03 Redis
Redis批量生成数据的实现
Jun 05 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 mssql 时间格式问题
2009/01/13 PHP
php 读取文件乱码问题
2010/02/20 PHP
php whois查询API制作方法
2011/06/23 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
php写app用的框架整理
2019/09/29 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
JS date对象的减法处理实现代码
2010/12/28 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
简单的分页代码js实现
2016/05/17 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
Python中的zipfile模块使用详解
2015/06/25 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
EM算法的python实现的方法步骤
2018/01/02 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
C#面试问题
2016/07/29 面试题
公司人事专员岗位职责
2014/08/11 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
2016年教师新年寄语
2015/08/18 职场文书