springboot实现监听 redis key 失效事件

springboot实现监听 redis key 失效事件,第1张

参考博客地址: https://blog.csdn.net/jiangxiulilinux/article/details/106555799

​ https://www.cnblogs.com/NJM-F/p/10442198.html

SpringBoot 监听 redis key 失效事件

需求

处理订单自动取消,比如下单 24 小时未支付修改订单状态。数据自动确认, 七天自动修改数据状态(客户没有修改状态就自动修改)。

解决方案1:

可以利用 redis 的 key 自动过期机制, 数据创建时 将 数据标识(需要保证唯一) 写入redis,过期时间设置 七天(按需求来定), 七天后检查数据状态,如果是初始状态,则进行处理。

开启redis key 过期提醒

修改 redis 相关时间配置,找到 redis 配置文件 redis.conf, 查看 notify-keyspace-events 的 配置项,如果没有,添加 notify-keyspace-events EA, 如果有值 添加 EA,相关参数说明如下:

K|键空间通知,所有通知以__keyspace@__ 为前缀
E|键事件通知,所有通知以 __keyevent@__ 为前缀
g|DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
$|字符串命令的通知
l|列表命令的通知
s|集合命令的通知
h|哈希命令的通知
z|有序集合命令的通知
x|过期事件,每当有过期键被删除时发送
e|驱逐事件,每当有键因为 maxmemory 政策而被删除时发送
A|参数 g$lshzxe 的别名
pom 需要增加的依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-redisartifactId>
dependency>

在 springboot 中 使用

定义配置 RedisListenerConfig

@Configuration
public class RedisListenerConfig {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 处理乱码
     * @return
     */
    @Bean
    public RedisTemplate redisTemplateInit() {
        // key序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //val实例化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    }

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

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

定义监听器, 实现 KeyExpirationEventMessageListener 接口

这里必须要判断 redis key的 前缀,redis里面有其他key 失效也会发通知到这里来

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 针对redis数据失效事件,进行数据处理
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
        String expiredKey = message.toString();
        if(expiredKey.startsWith("orderNo:")){
            //如果是order:开头的key,进行处理
            System.out.println(expiredKey);
            String substring = expiredKey.substring(8); //去掉orderNo
            System.out.println(substring);
        }
    }
}

测试 key 失效功能,

需要先配置redis,重启项目后,这里的 监听方法才能生效。

public class Test(){
    //@Resource
    //private RedisTemplate redisTemplate;

    // 这里也可以使用 静态注入

    private static RedisTemplate redisTemplate;

    @Resource
    public void setRedisTemplate(RedisTemplate redisTemplate) {
    	Test.redisTemplate = redisTemplate;
    }
    
    public static void main(String[] args) {
    	redisTemplate.opsForValue().set("orderNo:156556263124101022","dadada" ,5, TimeUnit.SECONDS );
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/795649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存