redis缓存过期策略,监听redis缓存失效事件

https://blog.csdn.net/weixin_41497481/article/details/85322794

 

场景:​​​​​​

redis缓存中的缓存过期了,但是还需要用到他,然而如果设置缓存为永不过期的话,数据会越堆越多,严重占用空间。所以需要对过期缓存进行监听。在缓存过期的时候进行处理。如果还需要用到就重新加载缓存,用不到了可以不用处理。解决了有用缓存过期的尴尬,又不会造成数据堆积。

过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发。

配置文件

而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex,默认为notify-keyspace-events "" 

# K    键空间通知,以__keyspace@<db>__为前缀
# E    键事件通知,以__keysevent@<db>__为前缀
# g    del , expipre , rename 等类型无关的通用命令的通知, ...
# $    String命令
# l    List命令
# s    Set命令
# h    Hash命令
# z    有序集合命令
# x    过期事件(每次key过期时生成)
# e    驱逐事件(当key在内存满了被清除时生成)
# A    g$lshzxe的别名,因此”AKE”意味着所有的事件
 

监听器:

 
  1. package connect.listen;

  2.  
  3. import org.springframework.data.redis.connection.MessageListener;

  4. import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;

  5. import org.springframework.data.redis.listener.PatternTopic;

  6. import org.springframework.data.redis.listener.RedisMessageListenerContainer;

  7. import org.springframework.data.redis.listener.Topic;

  8.  
  9. /**

  10. * @author wm

  11. */

  12. public class KeyExpirationEvent5MessageListener extends KeyExpirationEventMessageListener {

  13.  
  14.  
  15. private static final Topic KEYEVENT5_EXPIRED_TOPIC = new PatternTopic("__keyevent@*__:expired");

  16.  
  17. /**

  18. * Creates new {@link MessageListener} for {@code __keyevent@*__:expired} messages.

  19. *

  20. * @param listenerContainer must not be {@literal null}.

  21. */

  22. public KeyExpirationEvent5MessageListener(RedisMessageListenerContainer listenerContainer) {

  23. super(listenerContainer);

  24. }

  25.  
  26. @Override

  27. public void doRegister(RedisMessageListenerContainer listenerContainer) {

  28. listenerContainer.addMessageListener(this, KEYEVENT5_EXPIRED_TOPIC);

  29. }

  30. }

过期监听的管道默认是__keyevent@0__:expired,@后面的0表示第几个数据库,redis默认的数据库是0~15一共16个数据库,根据需求修改@后的数字。expired监听过期redis,可以换成*,监听所有。

配置bean:

 
  1. @Bean

  2. public RedisMessageListenerContainer container(JedisConnectionFactory jedisConnectionFactory, ApplicationContext context) {

  3. RedisMessageListenerContainer container = new RedisMessageListenerContainer();

  4. container.setConnectionFactory(jedisConnectionFactory);

  5. KeyExpirationEvent5MessageListener listener = new KeyExpirationEvent5MessageListener(container);

  6. listener.doRegister(container);

  7. listener.setApplicationEventPublisher(context);

  8. return container;

  9. }

监听:

 
  1. @EventListener(classes = RedisKeyExpiredEvent.class)

  2. @Override

  3. public void event(RedisKeyExpiredEvent event) {

  4. String expiredKey = new String(event.getSource());

  5. System.out.println(expiredKey);

  6. //expiredKey监听到的过期redis,根据业务要求进行操作

  7. }

启动项目就可以监听redis了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值