马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Redis中的事件是通过订阅/发布(sub/pub)功能来实现的。在redis中,某个key的逾期事件和该key的删除事件,是不一样的。
对于每个redis的数据库操纵,redis都会天生一个对应的事件。这些事件,形似以“__keyevent@*”开头。详细内容可以在redis的设置文件的EVENT NOTIFICATION模块中看到。
其中,参数notify-keyspace-events,用来控制是否开启这些关照。如果想使用逾期和删除事件,务必包管在redis的设置文件中,对该参数做出精确的设置并重启redis。
- K:keyspace事件,事件以__keyspace@<db>__为前缀进行发布;
- E:keyevent事件,事件以__keyevent@<db>__为前缀进行发布;
- g:一般性的,非特定类型的命令,比如del,expire,rename等;
- $:字符串特定命令;
- l:列表特定命令;
- s:集合特定命令;
- h:哈希特定命令;
- z:有序集合特定命令;
- x:过期事件,当某个键过期并删除时会产生该事件;
- e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件;
- A:g$lshzxe的别名,因此”AKE”意味着所有事件。
复制代码 回到开始的题目,key的逾期事件和key的删除事件,都是什么哪?
- SUBSCRIBE __keyevent@0__:expired
- SUBSCRIBE __keyevent@0__:del
复制代码 redis中用expired和del来区分key是逾期?还是被手动删除。
下面用springboot来示例下,这两个时间如何实现。
创建逾期事件监听器类:
- package com.***.***.listener;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.data.redis.connection.Message;
- import org.springframework.data.redis.connection.MessageListener;
- import org.springframework.data.redis.listener.PatternTopic;
- import org.springframework.stereotype.Component;
- import com.yinghui.adapter.service.ConsumeService;
- import com.yinghui.common.constant.Constants;
- import lombok.Data;
- import lombok.extern.slf4j.Slf4j;
- @Component
- @Data
- @Slf4j
- public class RedisKeyExpiredListener implements MessageListener {
- private final PatternTopic topic = new PatternTopic("__keyevent@*__:expired");
- @Autowired
- private ConsumeService consumeService;
- @Override
- public void onMessage(Message message, byte[] pattern) {
- String topic = new String(pattern);
- String msg = new String(message.getBody());
- System.out.println("接收到过期事件:"+msg);
- }
- }
复制代码 创建删除事件监听器类:
- import org.springframework.data.redis.connection.Message;
- import org.springframework.data.redis.connection.MessageListener;
- import org.springframework.data.redis.listener.PatternTopic;
- import org.springframework.stereotype.Component;
- import lombok.Data;
- @Component
- @Data
- public class RedisKeyDeleteListener implements MessageListener {
- // 监听主题
- private final PatternTopic topic = new PatternTopic("__keyevent@*__:del");
- @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);
- }
- }
复制代码 创建一个RedisMessageListenerContainer,并将以上两个事件监听器类,注册到对该容器中。
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.data.redis.connection.RedisConnectionFactory;
- import org.springframework.data.redis.listener.RedisMessageListenerContainer;
- @Configuration
- public class RedisListenerConfig {
-
- @Autowired
- private RedisKeyDeleteListener redisDeleteListener;
- @Autowired
- private RedisKeyExpiredListener redisExpiredListener;
- @Bean
- RedisMessageListenerContainer container(RedisConnectionFactory factory){
- RedisMessageListenerContainer container=new RedisMessageListenerContainer();
- container.setConnectionFactory(factory);
-
- //监听所有key的删除事件
- container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
- //监听所有key的过期事件
- container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
- return container;
- }
- }
复制代码 此时,我们可以分别在两个监听器类中,处理对应的事件,来完本钱身的业务。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |