中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot監聽Redis Key失效事件怎么實現定時任務

發布時間:2020-08-04 10:24:38 來源:億速云 閱讀:138 作者:小豬 欄目:編程語言

小編這次要給大家分享的是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,相關參數說明如下:

  • K:keyspace 事件,事件以 keyspace@ 為前綴進行發布
  • E:keyevent 事件,事件以 keyevent@ 為前綴進行發布
  • g:一般性的,非特定類型的命令,比如del,expire,rename等
  • $:字符串特定命令
  • l:列表特定命令
  • s:集合特定命令
  • h:哈希特定命令
  • z:有序集合特定命令
  • x:過期事件,當某個鍵過期并刪除時會產生該事件
  • e:驅逐事件,當某個鍵因 maxmemore 策略而被刪除時,產生該事件
  • A:g$lshzxe的別名,因此”AKE”意味著所有事件
     

引入依賴

在 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失效事件怎么實現定時任務的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绵竹市| 始兴县| 拉孜县| 阆中市| 蕉岭县| 鹤庆县| 天全县| 房产| 桓仁| 永昌县| 保德县| 新闻| 武冈市| 同仁县| 讷河市| 化州市| 大化| 庆安县| 龙口市| 九龙坡区| 集安市| 泾源县| 克什克腾旗| 三都| 榆社县| 洪洞县| 临漳县| 西青区| 汉沽区| 德格县| 北海市| 中江县| 新干县| 哈巴河县| 柯坪县| 泰宁县| 巴马| 增城市| 邳州市| 弥勒县| 页游|