当前位置:   article > 正文

监听Redis 缓存过期(Key 失效)事件_redis 缓存过期回调

redis 缓存过期回调

很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力。

所以今天介绍的就是 redis 缓存过期通知。

注: 楼主技术提升的同时, 这个博文失效吧, 这个只能适用于单机redis, 订单过期删除这些操作还是通过rocketMq, 或者时间轮, 或者Zset进行操作吧


1. 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 故需要开启 redis 的事件监听与发布

2. 修改 redis.conf 文件 

打开 notify-keyspace-events Ex 的注释,开启过期通知功能

  1. # 我这边开启事件监听
  2. notify-keyspace-events Ex

3. 重启redis , 即可测试失效事件的触发, 监听获取的值为 key
 


进入redis-client,进入监听

  1. 127.0.0.1:6379> PSUBSCRIBE __keyevent@*__:expired
  2. Reading messages... (press Ctrl-C to quit)
  3. 1) "psubscribe"
  4. 2) "__keyevent@*__:expired"
  5. 3) (integer) 1

再打开一个 redis-client,发送过期数据

  1. 127.0.0.1:6379> setex test 2 2
  2. OK

 

返回之前的 client,监听到过期事件

  1. 127.0.0.1:6379> PSUBSCRIBE __keyevent@*__:expired
  2. Reading messages... (press Ctrl-C to quit)
  3. 1) "psubscribe"
  4. 2) "__keyevent@*__:expired"
  5. 3) (integer) 1
  6. 1) "pmessage"
  7. 2) "__keyevent@*__:expired"
  8. 3) "__keyevent@0__:expired"
  9. 4) "test"

至此,redis 环境配置完毕;


接下来是服务端配置监听事件:

  1. /**
  2. * Description: Redis超时监听器
  3. * User: zhouzhou
  4. * Date: 2019-04-07
  5. * Time: 9:02 PM
  6. */
  7. @Service
  8. public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
  9. private static Logger log = LoggerFactory.getLogger(RedisKeyExpirationListener.class);
  10. public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
  11. super(listenerContainer);
  12. }
  13. @Override
  14. public void onMessage(Message message, byte[] pattern) {
  15. //获取过期的key
  16. String expireKey = message.toString();
  17. System.out.println("终于失效了");
  18. log.debug("key is:"+ expireKey);
  19. System.out.println(expireKey);
  20. }
  21. }

配置 redis 远程监听配置:

  1. /**
  2. * Description: redis 远程监听
  3. * User: zhouzhou
  4. * Date: 2019-04-17
  5. * Time: 3:04 PM
  6. */
  7. @Configuration
  8. public class RedisListenerConfig {
  9. @Bean
  10. RedisMessageListenerContainer listenerContainer(RedisConnectionFactory connectionFactory) {
  11. RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
  12. listenerContainer.setConnectionFactory(connectionFactory);
  13. return listenerContainer;
  14. }
  15. @Bean
  16. KeyExpirationEventMessageListener redisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
  17. return new RedisKeyExpirationListener(listenerContainer);
  18. }
  19. }

redis 连接的配置我就不发了。

启动项目,当我们再次通过 redis-client 进行测试;可以看到 console打印一下日志:

  1. 终于失效了
  2. test

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/685105
推荐阅读
相关标签
  

闽ICP备14008679号