業務場景
我們以訂單功能為例說明下:生成訂單後一段時間不支付訂單會自動關閉。最簡單的想法是設定定時任務輪詢,但是每個訂單的建立時間不一樣,定時任務的規則無法設定,如果將定時任務執行的間隔設定的過短,太影響效率。還有一種想法,在使用者進入訂單介面的時候,判斷時間執行相關操作。方式可能有很多,在這裡介紹一種監聽 redis 鍵值對過期時間來實現訂單自動關閉
實現思路
在生成訂單時,向 redis 中增加乙個 kv 鍵值對,k 為訂單號,保證通過 k 能定位到資料庫中的某個訂單即可,v 可為任意值。假設,生成訂單時向 redis 中存放 k 為訂單號,v 也為訂單號的鍵值對,並設定過期時間為 30 分鐘,如果該鍵值對在 30 分鐘過期後能夠傳送給程式乙個通知,或者執行乙個方法,那麼即可解決訂單關閉問題。實現:通過監聽 redis 提供的過期佇列來實現,監聽過期佇列後,如果 redis 中某乙個 kv 鍵值對過期了,那麼將向監聽者傳送訊息,監聽者可以獲取到該鍵值對的 k,注意,是獲取不到 v 的,因為已經過期了,這就是上面所提到的,為什麼要保證能通過 k 來定位到訂單,而 v 為任意值即可。拿到 k 後,通過 k 定位訂單,並判斷其狀態,如果是未支付,更新為關閉,或者取消狀態即可。
開啟 redis key 過期提醒
修改 redis 相關事件配置。找到 redis 配置檔案 redis.conf,檢視 notify-keyspace-events 配置項,如果沒有,新增 notify-keyspace-events ex,如果有值,則追加 ex,相關引數說明如下:
k:keyspace 事件,事件以 keyspace@ 為字首進行發布
e:keyevent 事件,事件以 keyevent@ 為字首進行發布
g:一般性的,非特定型別的命令,比如del,expire,rename等
: 字元
串特定命
令l:列
表特定命
令s:集
合特定命
令h:哈
希特定命
令z:有
序集合特
定命令x
:過期事
件,當某
個鍵過期
並刪除時
會產生該
事件e:
驅逐事件
,當某個
鍵因ma
xmem
ore策
略而被刪
除時,產
生該事件
a:
g:字串特定命令 l:列表特定命令 s:集合特定命令 h:雜湊特定命令 z:有序集合特定命令 x:過期事件,當某個鍵過期並刪除時會產生該事件 e:驅逐事件,當某個鍵因 maxmemore 策略而被刪除時,產生該事件 a:g
:字串特定
命令l:
列表特定
命令s:
集合特定
命令h:
雜湊特定
命令z:
有序集合
特定命令
x:過期
事件,當
某個鍵過
期並刪除
時會產生
該事件e
:驅逐事
件,當某
個鍵因m
axme
more
策略而被
刪除時,
產生該事
件a:g
lshzxe的別名,因此」ake」意味著所有事件
引入依賴
在 pom.xml 中新增 org.springframework.boot:spring-boot-starter-data-redis 依賴
org.springframework.boot
spring-boot-starter-data-redis
複製**
相關配置
定義配置 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
}複製**
定義*** 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
/*** 針對 redis 資料失效事件,進行資料處理
* @param message
* @param pattern
*/@override
public void onmessage(message message, byte pattern)
}
SAP中實現生產訂單自動關閉
對於生產訂單已經完成的訂單,那麼是用技術性完成 technical complete 的方式對訂單進行操作,目的是讓生產訂單對元件的預留進行清除。一般來說,大家普遍採用的是人工去進行生產訂單技術關閉的方式,且一般由乙個企業的訂單計畫員負責。但sap系統中也可以實現生產訂單自動技術性完成的方式。它的原...
RabbitMQ延時佇列實現訂單關閉
配置virtual host虛擬主機 spring.rabbitmq.virtual host test order close ip位址 spring.rabbitmq.host 127.0 0.1 使用者名稱 密碼 spring.rabbitmq.username guest spring.ra...
如何關閉 VIM 自動生成 字尾備份檔案功能
預設情況下使用vim程式設計,在修改檔案後系統會自動生成乙個帶 的備份檔案。怎麼讓vim不自動生成這些備份檔案呢?1.找到你的vim安裝目錄,如果是在windows下預設路徑安裝的,應該是在c program files vim 2.在 vim70 資料夾找到 vimrc example.vim 檔...