Springboot项目通过Redis键失效广播实现取消30分钟内未支付订单

我们在网上购物的时候,经常会遇到未支付,然后有个倒计时的情况,倒计时完了还未付款就取消订单的情况。

那么这个这个功能要怎么实现呢?

需求很简单,反正就是下单操作后,一段时间,进行另外的操作。想了一下好像Redis的广播好像也不错。

那我们来操作一下:

方法一:用Redis的失效广播

Redis是有两种事件通知方式的,分别是:键过期事件(keyspace notification)和键空间通知(pub/sub notification)。

键过期事件 就是键过期的时候,Redis会生成一个过期事件,发布给订阅者。这个键过期事件是 Redis 默认会发送的事件之一。通知的发送是基于订阅-发布模式(Pub/Sub),Redis 会将键过期事件发到 __keyevent@*__:expired 频道,这个 *是指定的数据库号。

键空间通知,键空间是Redis里面键的集合,可以监视键的创建、修改和删除等事件。(默认是不开的,因为会影响性能)

简单点说就是键过期事件主要关注键过期这一具体事件,而键空间通知则提供了更广泛的事件范围,包括键的创建、修改、删除等事件。

那我们这个需求很简单了嘛,直接监听默认的过期事件就好了。

 1.  注册一个监听器

        SpringBoot项目可以通过 实现 MessageListener 接口 来监听Redis 键过期事件。需要重写onMessage方法。

这个方法就是你的业务逻辑。我这里就先简单打印一下过期的Key

(注意:这里是拿不到这个Key对应的Value的)

@Component
public class RedisKeyListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] bytes) {
        String mess = message.toString();
        String messToString = Arrays.toString(message.getBody());
        System.out.println("onMessage...:" + mess);
        System.out.println("onMessage...:" + messToString);
    }
}

 2.注册一个监听容器,配置监听频道

        随便在什么配置类中注册成Bean就好,你可以新建一个RedisKeyListenerConfig(规范点是要这样),我由于做演示偷懒一下,就在RedisConfig里面写了。


@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        return template;
    }


    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, RedisKeyListener redisKeyListener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(redisKeyListener, new PatternTopic("__keyevent@*__:expired"));
        return container;
    }

}

RedisTemplate就不说了。

RedisMessageListenerContainer 是 Spring Data Redis包下的一个组件,用来管理 Redis 消息的监听、处理什么的。 这个容器 通过addMessageListener()方法注册消息监听器。

我们这里用的监听器就是第1步写的 RedisKeyListener,这个方法的第二个参数是指定要监听的频道。

__keyevent@*__:expired 表示监听所有数据库的键过期事件。你也可以改改,比如:

__keyevent@0__:expired 就表示 监听db0 (如下图)

到这里就完事了,直接run。到Redis中新增一个key。 

设置过期时间为3秒

等待三秒,成功打印。

这样一个简单的键过期事件监听就实现了。

那有了key,就等于有了orderId 那判断订单状态并取消订单就是随随便便的事情啦。

先到这里 后面有时间了补充一下用MQ的方案。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Spring BootRedis实现缓存的样例: 1. 添加Redis依赖 在pom.xml文件中添加如下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 配置Redis 在application.properties或application.yml文件中添加如下配置: ```yaml spring: redis: host: localhost port: 6379 ``` 3. 编写缓存代码 在需要缓存的方法上添加@Cacheable注解,并指定缓存的名称和值,如下所示: ```java @Service public class UserService { @Autowired private UserDao userDao; @Cacheable(value = "userCache", key = "#id") public User getUserById(Long id) { return userDao.getUserById(id); } } ``` 上述代码中,@Cacheable注解指定了缓存的名称为"userCache",并且使用方法的参数作为缓存的值。 4. 清理缓存 在需要清理缓存的方法上添加@CacheEvict注解,如下所示: ```java @Service public class UserService { @Autowired private UserDao userDao; @CacheEvict(value = "userCache", key = "#id") public void deleteUserById(Long id) { userDao.deleteUserById(id); } } ``` 上述代码中,@CacheEvict注解指定了需要清理的缓存名称和值。当调用deleteUserById方法时,缓存中与该值相关的数据将被清除。 需要注意的是,这只是一个简单的缓存实现样例,实际应用中需要根据具体的业务需求和系统特点来选择合适的缓存框架和配置方式。同时也需要注意缓存的一致性和安全性问题,避免出现数据不一致或者泄露敏感信息的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值