Redis的過期機制使用場景示例

上一篇 <<<Redis的事務(wù)操作(Mult和Watch)知識點
下一篇 >>>Redis實現(xiàn)分布式鎖的原理分析


下單30分鐘未支付則自動更改訂單狀態(tài)的方案有哪些?

1、使用定時任務(wù)輪詢查詢數(shù)據(jù)庫的狀態(tài)
2、設(shè)置redis的key有效期,接收過期時收到的通知進行處理
3、利用zookeeper的臨時節(jié)點過期機制【在zookeeper章節(jié)會補充上來】

redis的過期相關(guān)代碼

1. 業(yè)務(wù)設(shè)置key的過期時間

/**
 * 使用redis,設(shè)置有效期
 */
@RequestMapping("/saveOrder")
public String saveOrder() {
    // 1.生成token
    String orderToken = UUID.randomUUID().toString();
    String orderId = System.currentTimeMillis() + "";
    //2. 將該token存放到redis中,并設(shè)置過期時間
    redisUtils.setString(orderToken, orderId, 5L);
    OrderEntity orderEntity = new OrderEntity(null, "迦葉訂單", orderId, orderToken);
    int result = orderMapper.insertOrder(orderEntity);
    return result > 0 ? "success" : "fail";
}

2. 設(shè)置監(jiān)聽的bean配置

/**
 * 配置redis監(jiān)聽bean
 */
@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

3. redis的key過期具體處理代碼

/**
 * 訂閱監(jiān)聽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();
        // 根據(jù)key查詢 value 如果還還是為待支付狀態(tài) 將訂單改為已經(jīng)超時~~
        OrderEntity orderNumber = orderMapper.getOrderNumber(expireKey);
        if (orderNumber == null) {
            return;
        }
        if (orderNumber.getOrderStatus().equals(0)) {
            // 將訂單狀態(tài)改為已經(jīng)失效
            orderMapper.updateOrderStatus(expireKey, 2);
        }
    }
}

推薦閱讀:
<<<分布式緩存與本地緩存的區(qū)別
<<<Ehcache基礎(chǔ)知識
<<<SpringBoot整合Ehcache
<<<Redis的5種數(shù)據(jù)類型
<<<Redis存放實體對象的方式及區(qū)別
<<<Redis的應(yīng)用場景匯總
<<<Redis高效及線程安全的真正原因
<<<Redis為啥要分為16個庫
<<<RDB和AOF持久化方式的區(qū)別
<<<Redis與數(shù)據(jù)庫的一致性解決方案
<<<SpringBoot整合Redis的注解版本完成數(shù)據(jù)緩存
<<<Redis的淘汰策略
<<<Redis的事務(wù)操作(Mult和Watch)知識點
<<<Redis實現(xiàn)分布式鎖的原理分析
<<<Redis分布式鎖的實現(xiàn)代碼示例
<<<使用Redisson工具實現(xiàn)分布式鎖
<<<Redis集群模式之主從復(fù)制原理及存在的缺陷
<<<Redis集群模式之哨兵模式
<<<Redis集群模式之Cluster去中心化分片集群
<<<Linux環(huán)境下安裝單機Redis
<<<Redis Cluster集群環(huán)境搭建
<<<Redis Cluster如何動態(tài)擴容與縮容
<<<Redis Cluster主從節(jié)點自動切換
<<<Redis集群模式的類型和缺陷匯總
<<<Redis緩存的穿透、擊穿和雪崩效應(yīng)
<<<Redis解決穿透擊穿問題時使用的布隆過濾器知識點
<<<Redis與MySQL的數(shù)據(jù)同步解決方案
<<<阿里云的Canal框架實現(xiàn)Redis與Mysql同步原理及代碼示例
<<<阿里云的Canal框架配置
<<<Redis官方提出的redlock分布式鎖
<<<Redis的調(diào)優(yōu)設(shè)置
<<<Redis常見問題匯總

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容