Redis之key逾期和删除事件

打印 上一主题 下一主题

主题 969|帖子 969|积分 2909

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Redis中的事件是通过订阅/发布(sub/pub)功能来实现的。在redis中,某个key的逾期事件和该key的删除事件,是不一样的。
对于每个redis的数据库操纵,redis都会天生一个对应的事件。这些事件,形似以“__keyevent@*”开头。详细内容可以在redis的设置文件的EVENT NOTIFICATION模块中看到。
其中,参数notify-keyspace-events,用来控制是否开启这些关照。如果想使用逾期和删除事件,务必包管在redis的设置文件中,对该参数做出精确的设置并重启redis。
  1. K:keyspace事件,事件以__keyspace@<db>__为前缀进行发布;        
  2. E:keyevent事件,事件以__keyevent@<db>__为前缀进行发布;        
  3. g:一般性的,非特定类型的命令,比如del,expire,rename等;      
  4. $:字符串特定命令;        
  5. l:列表特定命令;        
  6. s:集合特定命令;        
  7. h:哈希特定命令;        
  8. z:有序集合特定命令;        
  9. x:过期事件,当某个键过期并删除时会产生该事件;        
  10. e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件;        
  11. A:g$lshzxe的别名,因此”AKE”意味着所有事件。
复制代码
回到开始的题目,key的逾期事件和key的删除事件,都是什么哪?
  1. SUBSCRIBE __keyevent@0__:expired
  2. SUBSCRIBE __keyevent@0__:del
复制代码
redis中用expired和del来区分key是逾期?还是被手动删除。
下面用springboot来示例下,这两个时间如何实现。
创建逾期事件监听器类:
  1. package com.***.***.listener;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.data.redis.connection.Message;
  4. import org.springframework.data.redis.connection.MessageListener;
  5. import org.springframework.data.redis.listener.PatternTopic;
  6. import org.springframework.stereotype.Component;
  7. import com.yinghui.adapter.service.ConsumeService;
  8. import com.yinghui.common.constant.Constants;
  9. import lombok.Data;
  10. import lombok.extern.slf4j.Slf4j;
  11. @Component
  12. @Data
  13. @Slf4j
  14. public class RedisKeyExpiredListener implements MessageListener {
  15.         private final PatternTopic topic = new PatternTopic("__keyevent@*__:expired");
  16.         @Autowired
  17.         private ConsumeService consumeService;
  18.         @Override
  19.         public void onMessage(Message message, byte[] pattern) {
  20.                 String topic = new String(pattern);
  21.                 String msg = new String(message.getBody());
  22.                 System.out.println("接收到过期事件:"+msg);
  23.         }
  24. }
复制代码
创建删除事件监听器类:
  1. import org.springframework.data.redis.connection.Message;
  2. import org.springframework.data.redis.connection.MessageListener;
  3. import org.springframework.data.redis.listener.PatternTopic;
  4. import org.springframework.stereotype.Component;
  5. import lombok.Data;
  6. @Component
  7. @Data
  8. public class RedisKeyDeleteListener implements MessageListener {
  9.         // 监听主题
  10.         private final PatternTopic topic = new PatternTopic("__keyevent@*__:del");
  11.         @Override
  12.         public void onMessage(Message message, byte[] pattern) {
  13.                 String topic = new String(pattern);
  14.                 String msg = new String(message.getBody());
  15.                 System.out.println("收到key的删除,消息主题是:" + topic + ",消息内容是:" + msg);
  16.         }
  17. }
复制代码
创建一个RedisMessageListenerContainer,并将以上两个事件监听器类,注册到对该容器中。
  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.data.redis.connection.RedisConnectionFactory;
  5. import org.springframework.data.redis.listener.RedisMessageListenerContainer;
  6. @Configuration
  7. public class RedisListenerConfig {
  8.        
  9.         @Autowired
  10.     private RedisKeyDeleteListener redisDeleteListener;
  11.     @Autowired
  12.     private RedisKeyExpiredListener redisExpiredListener;
  13.     @Bean
  14.     RedisMessageListenerContainer container(RedisConnectionFactory factory){
  15.         RedisMessageListenerContainer container=new RedisMessageListenerContainer();
  16.         container.setConnectionFactory(factory);
  17.         
  18.         //监听所有key的删除事件
  19.         container.addMessageListener(redisDeleteListener,redisDeleteListener.getTopic());
  20.         //监听所有key的过期事件
  21.         container.addMessageListener(redisExpiredListener,redisExpiredListener.getTopic());
  22.         return container;
  23.     }
  24. }
复制代码
此时,我们可以分别在两个监听器类中,处理对应的事件,来完本钱身的业务。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表