<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們以訂單功能為例說明下:
生成訂單後一段時間不支付訂單會自動關閉。最簡單的想法是設定定時任務輪詢,但是每個訂單的建立時間不一樣,定時任務的規則無法設定,如果將定時任務執行的間隔設定的過短,太影響效率。
還有一種想法,在使用者進入訂單介面的時候,判斷時間執行相關操作。方式可能有很多,在這裡介紹一種監聽 Redis 鍵值對過期時間來實現訂單自動關閉。
在生成訂單時,向 Redis 中增加一個 KV 鍵值對,K 為訂單號,保證通過 K 能定位到資料庫中的某個訂單即可,V 可為任意值。
假設,生成訂單時向 Redis 中存放 K 為訂單號,V 也為訂單號的鍵值對,並設定過期時間為 30 分鐘,如果該鍵值對在 30 分鐘過期後能夠傳送給程式一個通知,或者執行一個方法,那麼即可解決訂單關閉問題。
實現:通過監聽 Redis 提供的過期佇列來實現,監聽過期佇列後,如果 Redis 中某一個 KV 鍵值對過期了,那麼將向監聽者傳送訊息,監聽者可以獲取到該鍵值對的 K,注意,是獲取不到 V 的,因為已經過期了,這就是上面所提到的,為什麼要保證能通過 K 來定位到訂單,而 V 為任意值即可。拿到 K 後,通過 K 定位訂單,並判斷其狀態,如果是未支付,更新為關閉,或者取消狀態即可。
修改 redis 相關事件設定。找到 redis 組態檔 redis.conf,檢視 notify-keyspace-events 設定項,如果沒有,新增 notify-keyspace-events Ex,如果有值,則追加 Ex,相關引數說明如下:
在 pom.xml 中新增 org.springframework.boot:spring-boot-starter-data-redis 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
定義設定 RedisListenerConfig 實現監聽 Redis key 過期時間
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.listener.RedisMessageListenerContainer; @Configuration public class RedisListenerConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } }
定義監聽器 RedisKeyExpirationListener,實現KeyExpirationEventMessageListener 介面,檢視原始碼發現,該介面監聽所有 db 的過期事件 keyevent@*:expired"
import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; /** * 監聽所有db的過期事件__keyevent@*__:expired" */ @Component public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) { super(listenerContainer); } /** * 針對 redis 資料失效事件,進行資料處理 * @param message * @param pattern */ @Override public void onMessage(Message message, byte[] pattern) { // 獲取到失效的 key,進行取消訂單業務處理 String expiredKey = message.toString(); System.out.println(expiredKey); } }
在 Redis 官方手冊的keyspace-notifications: timing-of-expired-events中明確指出:
Basically expired events are generated when the Redis server deletes the key and not when the time to live theoretically reaches the value of zero
redis 自動過期的實現方式是:定時任務離線掃描並刪除部分過期鍵;在存取鍵時惰性檢查是否過期並刪除過期鍵。redis 從未保證會在設定的過期時間立即刪除並行送過期通知。實際上,過期通知晚於設定的過期時間數分鐘的情況也比較常見。
此外來鍵空間通知採用的是傳送即忘(fire and forget)策略,並不像訊息佇列一樣保證送達。當訂閱事件的使用者端會丟失所有在斷線期間所有分發給它的事件。
這是一種比定時掃描資料庫更 “LOW” 的解決方案,不建議使用。
一般實現的方法有幾種:
有一些方案雖然廣為流傳但存在著致命缺陷,不要用來實現延時任務
到此這篇關於利用Redis實現訂單30分鐘自動取消的文章就介紹到這了,更多相關Redis訂單30分鐘自動取消內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45