Redis 消息订阅实现,监听Redis键过期

本文介绍了如何在Java项目中使用RedisTemplate设置键的过期时间,并详细讲解了如何配置Redis服务器以监听键过期事件。通过修改redis.conf文件和编写监听器,可以实现实时响应键值对的失效。同时,文章提到了不同的消息处理器针对不同类型的Redis命令,如过期事件(x)和驱逐事件(e)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、RedisTemplate使用

Java项目中,使用RedisTemplate设置键-值失效时间,redisTemplate.opsForValue.set("key", "value", 10, TimeUnit.Hours);

设置该 键-值得失效时间为10个小时

二、监听该键值对失效

1. 配置redis服务器,修改redis.conf文件  

2. 编写监听器

@Component
public class Listener {

    /*
     * Redis消息监听器容器
     * 这个容器加载了RedisConnectionFactory和消息监听器
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                                            MessageListenerAdapter listenerAdapter){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("__keyevent@0__:expired"));
        return container;
    }

    /*
     * 将Receiver注册为一个消息监听器,并指定消息接收的方法(receiveMessage)
     * 如果不指定消息接收的方法,消息监听器会默认的寻找Receiver中的handleMessage这个方法作为消息接收的方法
     */
    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver){
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    /*
     * Receiver实例
     */
    @Bean
    Receiver receiver(CountDownLatch latch){
        return new Receiver(latch);
    }

    @Bean
    CountDownLatch latch(){
        return new CountDownLatch(1);
    }

    /*
     * Redis Template 用来发送消息
     */
    @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory){
        return new StringRedisTemplate(connectionFactory);
    }

}

三、编写消息处理器

public class Receiver {

    private CountDownLatch latch;

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Autowired
    public Receiver(CountDownLatch latch) {
        this.latch = latch;
    }

    public void receiveMessage(String message) {
        System.out.println("message: ", message);

        latch.countDown();
    }
}

 K:keyspace事件,事件以__keyspace@<db>__为前缀进行发布;

         E:keyevent事件,事件以__keyevent@<db>__为前缀进行发布;

         g:一般性的,非特定类型的命令,比如del,expire,rename等;

         $:字符串特定命令;

         l:列表特定命令;

         s:集合特定命令;

         h:哈希特定命令;

         z:有序集合特定命令;

         x:过期事件,当某个键过期并删除时会产生该事件;

         e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件;

         A:g$lshzxe的别名,因此”AKE”意味着所有事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值