IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis键通知(事件通知) -> 正文阅读

[大数据]Redis键通知(事件通知)

Redis键通知(事件通知)

通常,对于Redis这款中间件,最多的应该是作为缓存来使用,比较好的做法是会给Redis中的key设置一个过期时间,过期之后自动删除。那么,我们可能会有这样的需求,如果一个key被删除了,或者过期了,能否通知使用redis的应用程序呢,其实是有方法的。

从Redis:2.8.0开始,提供了键空间通知的功能,详见官方文档Redis Keyspace Notifications - Redis 。原理就是基于Redis的PUB/SUB机制,当键被发生了某种操作时,Redis会往特定的channel发布特定格式的消息,Redis客户端订阅相关channel就可以接受到消息并作相应的处理。

channel格式:keyevent@数据库ID:操作类型

# 删除键
__keyevent@0__:del
# 键过期
__keyevent@0__:expired
...

默认情况下,Redis键通知功能是禁用的,开启需要在配置文件中增加名字为notify-keyspace-events的配置,具体值配置为多少,官方文档中其实也给出了

K     Keyspace events, published with __keyspace@<db>__ prefix.
E     Keyevent events, published with __keyevent@<db>__ prefix.
g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
$     String commands
l     List commands
s     Set commands
h     Hash commands
z     Sorted set commands
t     Stream commands
d     Module key type events
x     Expired events (events generated every time a key expires)
e     Evicted events (events generated when a key is evicted for maxmemory)
m     Key miss events (events generated when a key that doesn't exist is accessed)
A     Alias for "g$lshztxed", so that the "AKE" string means all the events except "m".

我们需要接收键事件,E必须配置,否则其他配置不生效,具体怎么组合,看具体使用场景,举些例子

Eg 对某个键调用DEL,EXPIRE操作时,会收到通知
Ex 当某个键过期后会收到通知
Em 当检索某个不存在的键时会收到通知

开始具体实操一下,需求监听键过期事件

  1. 修改redis.conf配置文件并重启Redis

在这里插入图片描述

  1. 新建Maven项目,导入Redis相关依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置监听器容器
@Configuration
public class RedisConfig {

    @Bean
    public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(new KeyExpirationMessageListener(), new PatternTopic("__keyevent@0__:expired"));
        return container;
    }
}

@Slf4j
public class KeyExpirationMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("监听到键过期消息,消息内容:{},消息对应的键为:{}", message, new String(pattern));
        // TODO 业务逻辑
    }
}
  1. 启动项目,使用Redis客户端设置一个键,超时时间设置为10秒钟,观察控制台打印信息
    在这里插入图片描述
    在这里插入图片描述
  2. 当然,这是一种通用的配置方式,但如果仅仅是为了接收键过期提醒,可以使用spring-boot-starter-data-redis依赖中提供的KeyExpirationEventMessageListener监听器,本身已经实现了MessageListener接口,同时,又实现了ApplicationEventPublisherAware接口,具备了使用Spring事件驱动的功能

在这里插入图片描述
使用时需要配置RedisMessageListenerContainer、KeyExpirationEventMessageListener、ApplicationListener

@Slf4j
@Configuration
public class RedisConfig {

    @Bean
    public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //container.addMessageListener(new KeyExpirationMessageListener(), new PatternTopic("__keyevent@0__:expired"));
        return container;
    }


    @Bean
    public KeyExpirationEventMessageListener keyExpirationEventMessageListener(RedisMessageListenerContainer listenerContainer) {
        return new KeyExpirationEventMessageListener(listenerContainer);
    }

    @Bean
    public ApplicationListener applicationListener() {
        return (ApplicationListener<RedisKeyExpiredEvent>) event -> {
            log.info("监听到键过期消息,消息对应的键为:{},消息所属的channel为:{}", new String(event.getSource()), event.getChannel());
        };
    }
}

同样的,会在控制台看到相关信息
在这里插入图片描述
最后,需要说明的一点,Redis的键通知功能并不是一种完全可靠的机制,某些情况下通知不可达,比如因为网络问题导致应用跟Redis server断线重连,那么在断线时间范围内,有键触发了通知也无法送达应用,且事后无补偿,所以在可靠性要求很高的场景下并不适用。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:09:28  更:2021-09-27 14:10:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:25:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码