Redis 监听 key 失效事件

转载于:一看就懂!Springboot和Spring整合Redis 监听KEY失效事件_大誌的博客-CSDN博客

原理

原理很简单,采用了 redis 自带的订阅/发布结构。当 key 失效之后,会向同一个库的__keyevent@0__:expired主题发布一个订阅信息,信息内容就是失效的 key。然后订阅它

修改 redis 配置

window 版本,打开 redis 根目录下 redis.windows-service.conf

Crtl+F 搜索 notify,找到892行这个notify0keyspace-events后面修改为Ex
在这里插入图片描述

#  K     Keyspace events, published with __keyspace@<db>__ prefix.
#  E     Keyevent events, published with __keyevent@<db>__ prefix.
#  g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
#  $     String commands
#  l     List commands
#  s     Set commands
#  h     Hash commands
#  z     Sorted set commands
#  x     Expired events (events generated every time a key expires)
#  e     Evicted events (events generated when a key is evicted for maxmemory)
#  A     Alias for g$lshzxe, so that the "AKE" string means all the events.

翻译

K:keyspace 事件,事件以 keyspace@ 为前缀进行发布
E:keyevent 事件,事件以 keyevent@ 为前缀进行发布
g:一般性的,非特定类型的命令,比如del,expire,rename等
$:字符串特定命令
l:列表特定命令
s:集合特定命令
h:哈希特定命令
z:有序集合特定命令
x:过期事件,当某个键过期并删除时会产生该事件
e:驱逐事件,当某个键因 maxmemore 策略而被删除时,产生该事件
A:g$lshzxe的别名,因此”AKE”意味着所有事件

linux 版本同理,修改 redis.conf 配置文件

小提一下,重要:docker 镜像 redis 默认无配置文件,需要自己挂载,没用过 docker 我不会

重要的事情说三遍,重启 Redis!重启 Redis!重启 Redis!

Spring boot 项目

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

添加配置

# 端口
spring.redis.port=6379
# 主机地址
spring.redis.host=127.0.0.1
# 选择库
spring.redis.database=0

添加相关的类

简易配置redis

@Configuration
public class RedisConfiguration {

    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Autowired
    private KeyExpiredListener keyExpiredListener;

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        // 配置监听器监听的主题关联
        Topic topic = new ChannelTopic("__keyevent@0__:expired");
        redisMessageListenerContainer.addMessageListener(keyExpiredListener, topic);
        return redisMessageListenerContainer;
    }
}

写一个监听器

@Component
public class KeyExpiredListener implements MessageListener {
    private static Logger logger = LoggerFactory.getLogger(TestRecall.class);

    //这里是回调函数失效的时候回调用这个函数
    @Override
    public void onMessage(Message message, byte[] pattern) {
        logger.info("key 失效回调事件触发");

        System.out.println(new String(message.getBody()));
        System.out.println(new String(message.getChannel()));
        System.out.println(new String(pattern));

    }
}

测试

/**
 * 实现ApplicationRunner接口
 * 在springboot启动时会自动开启一个线程执行此run方法
 */
@Component
public class TestRecall implements ApplicationRunner {

    private static Logger logger = LoggerFactory.getLogger(TestRecall.class);

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 设置一个缓存,3秒后过期
        redisTemplate.opsForValue().set("key", "大誌", 3, TimeUnit.SECONDS);
        logger.info("设置缓存成功");
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值