search
HomeDatabaseRedisHow SpringBoot monitors redis Key change events
How SpringBoot monitors redis Key change eventsMay 26, 2023 pm 01:55 PM
redisspringbootkey

1. Function Overview

Key space notification allows the client to receive events that have changed the Redis key in some way by subscribing to the channel or mode.

All commands that modify key keys.

All keys that receive the LPUSH key value [value …] command.

All expired keys in the db database.

Events are distributed through the subscription and publishing functions (pub/sub) of Redis, so all clients that support the subscription and publishing functions can directly use the key without making any modifications. Space notification function.

Because the current subscription and publishing functions of Redis adopt a fire and forget strategy, if your program requires reliable notification of events, then the current key space notification may Not suitable for you: When a client subscribed to events goes offline, it loses all events that were distributed to it during the disconnection.

In the future, more reliable event distribution will be supported. This support may be achieved by making the subscription and publishing functions themselves more reliable, or by subscribing and publishing messages in Lua scripts. Publish to listen to achieve operations like pushing events to a list.

2. Event types

For each operation that modifies the database, keyspace notifications will send two different types of events.

For example, when executing the DEL key [key …] command on the key mykey of database 0, the system will distribute two message, which is equivalent to executing the following two PUBLISH channel message commands:

PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey

Subscribing to the first channel __keyspace@0__:mykey can receive events for all modified keys mykey in database No. 0, Subscribing to the second channel __keyevent@0__:del can receive all keys that execute the del command in database No. 0.

The channel prefixed by keyspace is called key-space notification, and the channel prefixed by keyevent is called key-event notification.

When the del mykey command is executed:

  • Subscribers to the keyspace channel will receive the name of the event that was executed, in this example, del .

  • Subscribers to the key event channel will receive the name of the key for which the event was executed, in this example, mykey .

3. Configuration

Because turning on the key space notification function requires some CPU, so in the default configuration, this function is turned off.

You can turn on or off the keyspace notification function by modifying the redis.conf file or directly using the CONFIG SET command:

When the parameter of the notify-keyspace-events option is an empty string, Function is turned off.

On the other hand, when the parameter is not an empty string, the function is turned on.

The parameters of notify-keyspace-events can be any combination of the following characters, which specifies which types of notifications the server should send:

How SpringBoot monitors redis Key change events

Input parameters There must be at least one K or E in it, otherwise, no matter what the other parameters are, no notification will be distributed.

For example, if you only want to subscribe to notifications related to lists in the keyspace, then the parameter should be set to Kl, and so on.

Set the parameter to a string "AKE" means sending all types of notifications.

Whenever a key is deleted due to expiration, an expired notification is generated.

Generate an evicted notification whenever a key is deleted to reclaim memory due to the maxmemory policy.

All commands will only generate notifications after the key has actually been changed.

For example, when SREM key member [member …hellip;] attempts to delete an element that does not exist in the collection, the deletion operation will fail because there is no real change to the key, so this Notifications will not be sent for the operation.

If you have any questions about the notification generated by the command, it is best to use the following command to verify it yourself:

Redis uses the following two methods to delete expired keys:

When a key is accessed, the program will check the key. If the key has expired, the key will be deleted.

The underlying system will progressively find and delete expired keys in the background to process keys that have expired but will not be accessed.
When an expired key is discovered by either of the above two programs and the key is deleted from the database, Redis will generate an expired notification.

Redis does not guarantee that a key whose lifetime (TTL) becomes 0 will be deleted immediately: if the program does not access this expired key, or if there are too many keys with lifetime, then the key The lifetime becomes 0, and there may be a significant time interval between when the key is actually deleted.

因此, Redis 产生expired通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0 的时候。

三、案例

按上文内容,我们先将redis的键空间通知开启,我们开启所有的通知,在可以端中测试后没问题再到代码中测试。

连接到redis 输入一下命令

How SpringBoot monitors redis Key change events

config set notify-keyspace-events KEA

  订阅键空间和键事件的主题

How SpringBoot monitors redis Key change events

psubscribe '__key*__:*'#对所有库键空间通知
 
psubscribe '__keyspace@2__:*' #是对db2数据库键空间通知
 
psubscribe '__keyspace@2__:order*' #是对db2数据库,key前缀为order所有键的键空间通知

创建一个 key :name valus:zhangsan

set name wsl

观察订阅的窗口 会受到两个消息,第一个是:键空间 第二个是键事件,键空间是内容是操作指令,主题中包含有key,键事件主题中包含了指令,内容是key。

How SpringBoot monitors redis Key change events

到这里说明已经开启了键空间通知

代码

以下代码采用string类型演示

在配置一下MessageListenerContainer类,将我们写好的监听类添加到该类中即可,删除和过期都是需要添加,我这里就一起添加了后面就不做演示。

@Configuration
public class RedisConfig {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Autowired
    private RedisUpdateAndAddListener redisUpdateAndAddListener;
 
    @Autowired
    private RedisDeleteListener redisDeleteListener;
 
    @Autowired
    private RedisExpiredListener redisExpiredListener;
 
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //监听所有的key的set事件
        container.addMessageListener(redisUpdateAndAddListener, redisUpdateAndAddListener.getTopic());
        //监听所有key的删除事件
        container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
        //监听所有key的过期事件
        container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
        return container;
    }
 
 
}

新增和修改都是set指令

所以监听的主题都一样,实现MessageListener接口,重写onMessage这里就是收到消息的处理逻辑

@Component
@Data
public class RedisUpdateAndAddListener implements MessageListener {
	//监听的主题
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:set");
 
    @Override
    public void onMessage(Message message,byte[] pattern){
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key更新或修改,消息主题是:"+ topic+",消息内容是:"+msg);
    }
 
}

在redis中对name这个key进行set操作

set name wsl

在控制台就可以看到name这个key被操作了

How SpringBoot monitors redis Key change events

删除

跟上面的更新监听一样,只需要把订阅主题更改一下即可。同样需要添加到这个RedisMessageListenerContainer,上面已经添加,这里不做演示

@Component
@Data
public class RedisDeleteListener implements MessageListener {
 
    //监听主题
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:del");
 
    /**
     *
     * @param message 消息
     * @param pattern 主题
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key的删除,消息主题是:"+ topic+",消息内容是:"+msg);
    }
}

 在redis输入命令,del name 在控制台可以看到已经收到消息了。

How SpringBoot monitors redis Key change events

过期

如上面的操作方式一样

@Data
@Component
public class RedisExpiredListener implements MessageListener {
 
    //监听主题
    private  final PatternTopic topic = new PatternTopic("__keyevent@*__:expired");
 
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String topic = new String(pattern);
        String msg = new String(message.getBody());
        System.out.println("收到key的过期,消息主题是:"+ topic+",消息内容是:"+msg);
    }
}

 在redis中写一个定时删除的keySETEX age 18 3三秒后就可以控制台打印了相关信息

How SpringBoot monitors redis Key change events

The above is the detailed content of How SpringBoot monitors redis Key change events. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:亿速云. If there is any infringement, please contact admin@php.cn delete
es和redis区别es和redis区别Jul 06, 2019 pm 01:45 PM

Redis是现在最热门的key-value数据库,Redis的最大特点是key-value存储所带来的简单和高性能;相较于MongoDB和Redis,晚一年发布的ES可能知名度要低一些,ES的特点是搜索,ES是围绕搜索设计的。

一起来聊聊Redis有什么优势和特点一起来聊聊Redis有什么优势和特点May 16, 2022 pm 06:04 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于redis的一些优势和特点,Redis 是一个开源的使用ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式存储数据库,下面一起来看一下,希望对大家有帮助。

实例详解Redis Cluster集群收缩主从节点实例详解Redis Cluster集群收缩主从节点Apr 21, 2022 pm 06:23 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis Cluster集群收缩主从节点的相关问题,包括了Cluster集群收缩概念、将6390主节点从集群中收缩、验证数据迁移过程是否导致数据异常等,希望对大家有帮助。

Redis实现排行榜及相同积分按时间排序功能的实现Redis实现排行榜及相同积分按时间排序功能的实现Aug 22, 2022 pm 05:51 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,希望对大家有帮助。

详细解析Redis中命令的原子性详细解析Redis中命令的原子性Jun 01, 2022 am 11:58 AM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于原子操作中命令原子性的相关问题,包括了处理并发的方案、编程模型、多IO线程以及单命令的相关内容,下面一起看一下,希望对大家有帮助。

一文搞懂redis的bitmap一文搞懂redis的bitmapApr 27, 2022 pm 07:48 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了bitmap问题,Redis 为我们提供了位图这一数据结构,位图数据结构其实并不是一个全新的玩意,我们可以简单的认为就是个数组,只是里面的内容只能为0或1而已,希望对大家有帮助。

实例详解Redis实现排行榜及相同积分按时间排序功能的实现实例详解Redis实现排行榜及相同积分按时间排序功能的实现Aug 26, 2022 pm 02:09 PM

本篇文章给大家带来了关于redis的相关知识,其中主要介绍了Redis实现排行榜及相同积分按时间排序,本文通过实例代码给大家介绍的非常详细,下面一起来看一下,希望对大家有帮助。

redis error什么意思redis error什么意思Jun 17, 2019 am 11:07 AM

redis error就是redis数据库和其组合使用的部件出现错误,这个出现的错误有很多种,例如Redis被配置为保存数据库快照,但它不能持久化到硬盘,用来修改集合数据的命令不能用。

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools