業(yè)務(wù)系統(tǒng)設(shè)計中棍潘,常有訂單自動關(guān)閉的功能恃鞋,下單后指定時間內(nèi)沒有支付則自動關(guān)閉訂單。這里介紹一種利用redis鍵失效通知實現(xiàn)訂單自動關(guān)閉的方法
redis鍵失效策略原理
blog.csdn.net/zhu_tianwei/article/details/80169900
實現(xiàn)步驟
- 在創(chuàng)建訂單時,用訂單Id+前綴組成key,存儲到redis中,并設(shè)置過期時間
public void setEx(String key, String value, long timeout, TimeUnit unit) {
this.stringRedisTemplate.opsForValue().set(key, value, timeout, unit);
}
- 在應(yīng)用中新建listener繼承KeyExpirationEventMessageListener亦歉,并且重寫onMessage方法
@Override
public void onMessage(Message message, byte[] pattern) {}
其中message即為失效key的名稱恤浪,去掉前綴后取出訂單Id,做關(guān)閉訂單處理
需要注意的一點是肴楷,在多個應(yīng)用部署的情況下水由,每個客戶端都會收到channel發(fā)布的失效事件,所以需要在業(yè)務(wù)處理時使用鎖鎖住該訂單
public boolean tryLock(String key, String value, int expireTime) throws Exception {
return this.stringRedisTemplate.opsForValue().setIfAbsent(key, value, (long)expireTime, TimeUnit.MILLISECONDS);
}