如何實現自動關閉訂單的功能?

2021-10-16 15:46:58 字數 3041 閱讀 5253

業務場景

我們以訂單功能為例說明下:生成訂單後一段時間不支付訂單會自動關閉。最簡單的想法是設定定時任務輪詢,但是每個訂單的建立時間不一樣,定時任務的規則無法設定,如果將定時任務執行的間隔設定的過短,太影響效率。還有一種想法,在使用者進入訂單介面的時候,判斷時間執行相關操作。方式可能有很多,在這裡介紹一種監聽 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 檔...