栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot实现监听 redis key 失效事件(用于实现数据自动确认功能)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot实现监听 redis key 失效事件(用于实现数据自动确认功能)

参考博客地址: 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 需要增加的依赖


    org.springframework.boot
    spring-boot-starter-data-redis

在 springboot 中 使用

定义配置 RedisListenerConfig

@Configuration
public class RedisListenerConfig {

    @Autowired
    private RedisTemplate redisTemplate;

    
    @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);
    }

    
    @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 );
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号