基于Redis過期事件實(shí)現(xiàn)訂單超時(shí)取消
訂單超時(shí)取消的實(shí)現(xiàn),首先想到的是定時(shí)任務(wù),但是這種實(shí)現(xiàn)方式在訂單量較大的情況下是有問題的,而且時(shí)間也會有誤差,最大時(shí)間差就是定時(shí)任務(wù)的執(zhí)行間隔時(shí)間。
使用redis的過期監(jiān)聽事件可以比較好的解決這個(gè)問題。實(shí)現(xiàn)的方式是訂單創(chuàng)建后向redus中存一記錄,一般就以訂單號為key。設(shè)置過期時(shí)間(訂單超時(shí)時(shí)間),一旦時(shí)間超時(shí)會觸發(fā)監(jiān)聽事件,這時(shí)候就可以通過key判斷這個(gè)訂單是否支付,未支付時(shí)取消訂單。
redis過期監(jiān)聽的實(shí)現(xiàn):
1.修改redis.windows.conf配置文件中notify-keyspace-events的值
默認(rèn)配置notify-keyspace-events的值為" ",修改為 notify-keyspace-events Ex 這樣便開啟了過期事件
2. 創(chuàng)建配置類RedisListenerConfig(配置RedisMessageListenerContainer這個(gè)Bean)
@Configuration public class RedisListenerConfig { @Autowired private RedisTemplate redisTemplate; /** * 處理亂碼 * @return */ @Bean public RedisTemplate redisTemplateInit() { // key序列化 redisTemplate.setKeySerializer(new StringRedisSerializer()); //val實(shí)例化 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包下的實(shí)現(xiàn)類,通過繼承這個(gè)類重寫onMessage方法可以實(shí)現(xiàn)對redis所有過期事件的監(jiān)聽。
@Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer container) { super(container); } /** * 針對redis數(shù)據(jù)失效事件,進(jìn)行數(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+"的訂單超時(shí)未支付,取消訂單"); } } }
測試
通過redis模擬創(chuàng)建一個(gè)有效時(shí)間為5s的訂單:
5秒后程序成功監(jiān)聽到了過期事件:
到此這篇關(guān)于基于Redis過期事件實(shí)現(xiàn)訂單超時(shí)取消的文章就介紹到這了,更多相關(guān)Redis 訂單超時(shí)取消內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis-benchmark并發(fā)壓力測試的問題解析
這篇文章主要介紹了redis-benchmark并發(fā)壓力測試的問題解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01