当前位置: 首页>后端>正文

Redis的过期机制使用场景示例

上一篇 <<<Redis的事务操作(Mult和Watch)知识点
下一篇 >>>Redis实现分布式锁的原理分析

下单30分钟未支付则自动更改订单状态的方案有哪些?

1、使用定时任务轮询查询数据库的状态
2、设置redis的key有效期,接收过期时收到的通知进行处理
3、利用zookeeper的临时节点过期机制【在zookeeper章节会补充上来】

redis的过期相关代码

1. 业务设置key的过期时间

/**
 * 使用redis,设置有效期
 */
@RequestMapping("/saveOrder")
public String saveOrder() {
    // 1.生成token
    String orderToken = UUID.randomUUID().toString();
    String orderId = System.currentTimeMillis() + "";
    //2. 将该token存放到redis中,并设置过期时间
    redisUtils.setString(orderToken, orderId, 5L);
    OrderEntity orderEntity = new OrderEntity(null, "迦叶订单", orderId, orderToken);
    int result = orderMapper.insertOrder(orderEntity);
    return result > 0 "success" : "fail";
}

2. 设置监听的bean配置

/**
 * 配置redis监听bean
 */
@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

3. redis的key过期具体处理代码

/**
 * 订阅监听onMessage
 */
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Autowired
    private OrderMapper orderMapper;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expireKey = message.toString();
        // 根据key查询 value 如果还还是为待支付状态 将订单改为已经超时~~
        OrderEntity orderNumber = orderMapper.getOrderNumber(expireKey);
        if (orderNumber == null) {
            return;
        }
        if (orderNumber.getOrderStatus().equals(0)) {
            // 将订单状态改为已经失效
            orderMapper.updateOrderStatus(expireKey, 2);
        }
    }
}

推荐阅读:
<<<分布式缓存与本地缓存的区别
<<<Ehcache基础知识
<<<SpringBoot整合Ehcache
<<<Redis的5种数据类型
<<<Redis存放实体对象的方式及区别
<<<Redis的应用场景汇总
<<<Redis高效及线程安全的真正原因
<<<Redis为啥要分为16个库
<<<RDB和AOF持久化方式的区别
<<<Redis与数据库的一致性解决方案
<<<SpringBoot整合Redis的注解版本完成数据缓存
<<<Redis的淘汰策略
<<<Redis的事务操作(Mult和Watch)知识点
<<<Redis实现分布式锁的原理分析
<<<Redis分布式锁的实现代码示例
<<<使用Redisson工具实现分布式锁
<<<Redis集群模式之主从复制原理及存在的缺陷
<<<Redis集群模式之哨兵模式
<<<Redis集群模式之Cluster去中心化分片集群
<<<Linux环境下安装单机Redis
<<<Redis Cluster集群环境搭建
<<<Redis Cluster如何动态扩容与缩容
<<<Redis Cluster主从节点自动切换
<<<Redis集群模式的类型和缺陷汇总
<<<Redis缓存的穿透、击穿和雪崩效应
<<<Redis解决穿透击穿问题时使用的布隆过滤器知识点
<<<Redis与MySQL的数据同步解决方案
<<<阿里云的Canal框架实现Redis与Mysql同步原理及代码示例
<<<阿里云的Canal框架配置
<<<Redis官方提出的redlock分布式锁
<<<Redis的调优设置
<<<Redis常见问题汇总


https://www.xamrdz.com/backend/3sb1945770.html

相关文章: