訂單超時取消的實現(xiàn),首先想到的是定時任務(wù),但是這種實現(xiàn)方式在訂單量較大的情況下是有問題的,而且時間也會有誤差,最大時間差就是定時任務(wù)的執(zhí)行間隔時間。
使用redis的過期監(jiān)聽事件可以比較好的解決這個問題。實現(xiàn)的方式是訂單創(chuàng)建后向redus中存一記錄,一般就以訂單號為key。設(shè)置過期時間(訂單超時時間),一旦時間超時會觸發(fā)監(jiān)聽事件,這時候就可以通過key判斷這個訂單是否支付,未支付時取消訂單。
redis過期監(jiān)聽的實現(xiàn):
1.修改redis.windows.conf配置文件中notify-keyspace-events的值
默認配置notify-keyspace-events的值為" ",修改為 notify-keyspace-events Ex 這樣便開啟了過期事件
2. 創(chuàng)建配置類RedisListenerConfig(配置RedisMessageListenerContainer這個Bean)
@Configuration
public class RedisListenerConfig {
@Autowired
private RedisTemplate redisTemplate;
/**
* 處理亂碼
* @return
*/
@Bean
public RedisTemplate redisTemplateInit() {
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//val實例化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
return container;
}
}
3.繼承KeyExpirationEventMessageListener創(chuàng)建redis過期事件的監(jiān)聽類
KeyExpirationEventMessageListener類是org.springframework.data.redis.listener包下的實現(xiàn)類,通過繼承這個類重寫onMessage方法可以實現(xiàn)對redis所有過期事件的監(jiān)聽。
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
public RedisKeyExpirationListener(RedisMessageListenerContainer container) {
super(container);
}
/**
* 針對redis數(shù)據(jù)失效事件,進行數(shù)據(jù)處理
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
String key=message.toString();//生效的key
if (key!=null key.startsWith("order")){//從失效key中篩選代表訂單失效的key
//截取訂單號,查詢訂單,如果是未支付狀態(tài)則取消訂單
String orderNo=key.substring(5);
System.out.println("訂單號為:"+orderNo+"的訂單超時未支付,取消訂單");
}
}
}
測試
通過redis模擬創(chuàng)建一個有效時間為5s的訂單:
5秒后程序成功監(jiān)聽到了過期事件:
到此這篇關(guān)于基于Redis過期事件實現(xiàn)訂單超時取消的文章就介紹到這了,更多相關(guān)Redis 訂單超時取消內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Redis實現(xiàn)訂單自動過期功能的示例代碼
- Redis中的String類型及使用Redis解決訂單秒殺超賣問題
- 使用PHP+Redis實現(xiàn)延遲任務(wù),實現(xiàn)自動取消訂單功能
- PHP實現(xiàn)電商訂單自動確認收貨redis隊列