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

上一篇 << 下一篇 >>>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);
        }
    }
}

推荐阅读:
<<<分布式缓存与本地缓存的区别
<< << << << << << << << << << << << << << <<<使用Redisson工具实现分布式锁
<< << << << << << << << << << << <<<阿里云的Canal框架实现Redis与Mysql同步原理及代码示例
<<<阿里云的Canal框架配置
<< << <<

你可能感兴趣的:(Redis的过期机制使用场景示例)