使用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 相关文章推荐
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
Redis可视化客户端小结
Jun 10 Redis
Redis性能监控的实现
Jul 09 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
基于Redis结合SpringBoot的秒杀案例详解
Oct 05 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Redis分布式锁的7种实现
Apr 01 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 Redis
Redis 限流器
May 15 Redis
解决 redis 无法远程连接
May 15 Redis
Redis特殊数据类型bitmap位图
Jun 01 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小程序自动提交到自助友情连接
2009/11/24 PHP
PHP学习笔记之二
2011/01/17 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python检测网络延迟的代码
2018/05/15 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
自我鉴定书范文
2013/10/02 职场文书
人事专员工作职责
2014/02/22 职场文书
超市中秋节促销方案
2014/03/21 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
幼儿园中班教师个人工作总结
2015/02/06 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
中学推普周活动总结
2015/05/07 职场文书
建国大业观后感800字
2015/06/01 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python
python热力图实现的完整实例
2022/06/25 Python