使用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安装启动及常见数据类型
Apr 14 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
解析Redis Cluster原理
Jun 21 Redis
厉害!这是Redis可视化工具最全的横向评测
Jul 15 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
详解redis在微服务领域的贡献
Oct 16 Redis
关于SpringBoot 使用 Redis 分布式锁解决并发问题
Nov 17 Redis
解决 Redis 秒杀超卖场景的高并发
Apr 12 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
Redis主从复制操作和配置详情
Sep 23 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中PDO方式实现数据库的增删改查
2015/05/17 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
python进阶教程之异常处理
2014/08/30 Python
Android分包MultiDex策略详解
2017/10/30 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
python 字符串只保留汉字的方法
2018/11/16 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
Python解析微信dat文件的方法
2020/11/30 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
项目经理的岗位职责
2013/11/23 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
电子商务专业自我鉴定
2013/12/18 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
工作检讨书大全
2015/01/26 职场文书
综合素质评价自我评价
2015/03/06 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL