您好,登錄后才能下訂單哦!
小編這次要給大家分享的是Spring Boot監聽Redis Key失效事件怎么實現定時任務,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
業務場景
我們以訂單功能為例說明下:
生成訂單后一段時間不支付訂單會自動關閉。最簡單的想法是設置定時任務輪詢,但是每個訂單的創建時間不一樣,定時任務的規則無法設定,如果將定時任務執行的間隔設置的過短,太影響效率。
還有一種想法,在用戶進入訂單界面的時候,判斷時間執行相關操作。方式可能有很多,在這里介紹一種監聽 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,相關參數說明如下:
引入依賴
在 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); } }
看完這篇關于Spring Boot監聽Redis Key失效事件怎么實現定時任務的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。