Redis监听key过期

前言

有时候,在项目我们需要对redis的某些key进行监听…判断是否过期

方法1:定时任务不断判断key是否存在…

方法2:监听rediskey…当过期后,可直接拿到已过期的key

接下来,直入主题,上代码,上界面显示…:

可选择库进行过期KEY监听

此方式,亦可监听所有库KEY 过期…

1.定义类,实现MessageListener

@Component
public class RedisMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        //body 即为redis的过期Key了,
        String body = new String(message.getBody(), StandardCharsets.UTF_8);
        System.out.println(body);

    }
}

2.监听配置类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
/**
 * @author : leilei
 * @date : 21:54 2020/10/25
 * @desc : redis监听配置类
 */
@Configuration
public class RedisMessageConfig {

    private final RedisMessageListener redisMessageListener;
    @Autowired
    public RedisMessageConfig(RedisMessageListener redisMessageListener) {
        this.redisMessageListener = redisMessageListener;
    }
    /**
     * 监听策略..
     * __keyevent@db__:expired 
     * __keyevent@1__:expired    即监听索引库1 的过期key
     * __keyevent@2__:expired    即监听索引库2 的过期key
     * __keyevent@*__:expired    即监听所有索引库 的过期key
     * @return
     */
    @Bean
    public PatternTopic topic() {
        return new PatternTopic("__keyevent@*__:expired");
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(
            @Autowired RedisConnectionFactory redisConnectionFactory) {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        //将监听类,以及监听策略作为参数
        redisMessageListenerContainer.addMessageListener(redisMessageListener,topic());
        return redisMessageListenerContainer;
    }
}

演示:

2020 10-25 10:39:14 设置过期Key zs ttl 10

file

2020 10-25 10:39:24 监听到key zs 已过期

上边的配置仅为可能监听某个别库key 过期配置写法…

如果你需要监听所有库 key 过期…可简化代码如下:

霸道的监听所有库KEY 过期

1.定义类继承KeyExpirationEventMessageListener

首先,仍需定义一个类,但是不是实现MessageListener 而是改为继承KeyExpirationEventMessageListener

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener{
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 监听key过期事件
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 获取到失效的 key
        String key = new String(message.getBody(), StandardCharsets.UTF_8);
        System.out.println(key);
    }
}

2.监听配置类

实际上 继承了此类 就等于使用了监听策略 keyevent@*:expired 即监听所有库的key过期事件

然后呢,我们依然需要定义一个监听配置类

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

如此,简单的几行代码即可实现对redis所有库的 KEY 过期事件的监听了!!!

1. 本站所有资源来源于用户上传和网络,如有侵权请及时联系删除,本站不承担任何法律责任!
2. 分享目的仅供大家学习和研究,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的教程、源码等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"www.94zyw.com",如遇到无法解压的请联系管理员!
94资源网 » Redis监听key过期