使用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 sentinel 频繁主备切换的问题
Apr 12 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
使用redis实现延迟通知功能(Redis过期键通知)
Sep 04 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 Redis
解决linux下redis数据库overcommit_memory问题
Feb 24 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 Redis
muduo TcpServer模块源码分析
Apr 26 Redis
Redis基本数据类型String常用操作命令
Jun 01 Redis
Redis实现分布式锁的五种方法详解
Jun 14 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与JavaScript针对Cookie的读写、交互操作方法详解
2017/08/07 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
PHP中“=&gt;
2019/03/01 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
图解js图片轮播效果
2015/12/20 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
Pytorch之parameters的使用
2019/12/31 Python
Python实现像awk一样分割字符串
2020/09/15 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
监理员的岗位职责
2013/11/13 职场文书
部队学习十八大感言
2014/01/11 职场文书
高中地理教学反思
2014/01/29 职场文书
八项规定整改措施
2014/02/12 职场文书
主要负责人任命书
2014/06/06 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python