使用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三种高可用方式部署的实现
May 11 Redis
Windows下redis下载、redis安装及使用教程
Jun 02 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
Redis入门教程详解
Aug 30 Redis
使用redis实现延迟通知功能(Redis过期键通知)
Sep 04 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
Redis监控工具RedisInsight安装与使用
Mar 21 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
浅谈Redis缓冲区机制
Jun 05 Redis
Redis唯一ID生成器的实现
Jul 07 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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
php cli 小技巧
2013/06/03 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
小程序实现录音功能
2020/09/22 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
详解Python中的测试工具
2019/06/09 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
绿化工程实施方案
2014/03/17 职场文书
教师个人培训总结
2015/02/11 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
python ansible自动化运维工具执行流程
2021/06/24 Python