在SpringBoot中使用redis中的zset實現延遲任務

為什么使用zset實現延遲任務

ZSET(有序集合)適合實現延遲任務的原因主要有以下幾點:

  1. 排序特性ZSET根據分數(score)自動排序,這使得我們可以將任務的執行時間作為分數,從而能夠輕松地獲取到即將執行的任務。
  2. 范圍查詢ZSET支持范圍查詢,我們可以查詢分數在某個區間內的所有元素,這對于獲取所有已到期的任務非常方便。
  3. 高效性ZSET的操作通常都是高效的,比如添加、刪除和范圍查詢等操作的時間復雜度通常為O(log(N)),這使得它適合用于需要頻繁操作的任務隊列。
  4. 原子操作ZSET提供了原子操作,比如添加元素時如果元素已存在則會更新其分數,這有助于避免在并發環境中出現數據一致性問題。
  5. 靈活性ZSET允許同一個集合中存在多個相同分數的元素,這使得我們可以存儲多個同一時間到期的任務。

實現步驟

1、添加redis依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、配置redis

spring.redis.host=localhost
spring.redis.port=6379

3、創建ZSET操作服務

創建一個服務類來封裝對ZSET的操作:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;
import java.util.Set;
@Service
public class DelayTaskService {// 定義一個常量作為延遲任務隊列的鍵private static final String DELAY_TASK_KEY = "delayTaskQueue";// 注入RedisTemplate用于操作Redisprivate final RedisTemplate<String, String> redisTemplate;// 通過構造函數注入RedisTemplate@Autowiredpublic DelayTaskService(RedisTemplate<String, String> redisTemplate) {this.redisTemplate = redisTemplate;}/*** 添加一個延遲任務* @param taskId 任務ID* @param delayMillis 延遲執行的毫秒數*/public void addTask(String taskId, long delayMillis) {// 計算任務的執行時間(當前時間 + 延遲時間)long executeTime = System.currentTimeMillis() + delayMillis;// 將任務添加到ZSET中,分數為執行時間redisTemplate.opsForZSet().add(DELAY_TASK_KEY, taskId, executeTime);}/*** 處理到期的任務*/public void processTasks() {// 獲取當前時間long now = System.currentTimeMillis();// 查詢ZSET中小于或等于當前時間的所有任務Set<String> tasks = redisTemplate.opsForZSet().rangeByScore(DELAY_TASK_KEY, 0, now);// 如果有任務,則進行處理if (tasks != null && !tasks.isEmpty()) {for (String taskId : tasks) {// 從ZSET中移除任務,如果移除成功(任務存在),則處理任務if (redisTemplate.opsForZSet().remove(DELAY_TASK_KEY, taskId) > 0) {handleTask(taskId);}}}}/*** 處理具體的任務* @param taskId 任務ID*/private void handleTask(String taskId) {// 這里實現任務處理的邏輯System.out.println("處理任務:" + taskId);}
}

4、定時輪詢ZSET

創建一個定時任務來定期檢查ZSET中是否有到期的任務:

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class TaskScheduler {// 注入DelayTaskService用于處理任務private final DelayTaskService delayTaskService;// 通過構造函數注入DelayTaskService@Autowiredpublic TaskScheduler(DelayTaskService delayTaskService) {this.delayTaskService = delayTaskService;}/*** 定時檢查并處理任務*/@Scheduled(fixedRate = 1000) // 每1000毫秒執行一次public void checkAndProcessTasks() {// 調用DelayTaskService的processTasks方法delayTaskService.processTasks();}
}

DelayTaskService負責添加和處理延遲任務,而TaskScheduler負責定期調用processTasks方法來檢查和處理到期的任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19496.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OAK相機如何將 YOLOv9 模型轉換成 blob 格式?

編輯&#xff1a;OAK中國 首發&#xff1a;oakchina.cn 喜歡的話&#xff0c;請多多&#x1f44d;??? 內容可能會不定期更新&#xff0c;官網內容都是最新的&#xff0c;請查看首發地址鏈接。 Hello&#xff0c;大家好&#xff0c;這里是OAK中國&#xff0c;我是Ashely。 專…

最新消息:騰訊大模型App“騰訊元寶“上線了

&#x1f9d9;?♂? 諸位好&#xff0c;吾乃斜杠君&#xff0c;編程界之翹楚&#xff0c;代碼之大師。算法如流水&#xff0c;邏輯如棋局。 &#x1f4dc; 吾之筆記&#xff0c;內含諸般技術之秘訣。吾欲以此筆記&#xff0c;傳授編程之道&#xff0c;助汝解技術難題。 &#…

Python代碼:二十八、密碼游戲

1、題目 牛牛和牛妹一起玩密碼游戲&#xff0c;牛牛作為發送方會發送一個4位數的整數給牛妹&#xff0c;牛妹接收后將對密碼進行破解。 破解方案如下&#xff1a;每位數字都要加上3再除以9的余數代替該位數字&#xff0c;然后將第1位和第3位數字交換&#xff0c;第2位和第4位…

2024年藝術鑒賞與科學教育國際會議(ICAASE 2024)

2024年藝術鑒賞與科學教育國際會議 2024 International Conference on Art Appreciation and Science Education 【1】會議簡介 2024年藝術鑒賞與科學教育國際會議是一場集藝術、科學和教育于一體的國際性學術盛會。本次會議旨在推動藝術鑒賞與科學教育領域的深入交流與合作&am…

C語言(字符函數和字符串函數)1

Hi~&#xff01;這里是奮斗的小羊&#xff0c;很榮幸各位能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;關注收藏&#xff0c;歡迎歡迎~~ &#x1f4a5;個人主頁&#xff1a;小羊在奮斗 &#x1f4a5;所屬專欄&#xff1a;C語言 本系列文章為個人學習筆記&#x…

python API自動化(接口測試基礎與原理)

1.接口測試概念及應用 什么是接口 接口是前后端溝通的橋梁&#xff0c;是數據傳輸的通道&#xff0c;包括外部接口、內部接口,內部接口又包括&#xff1a;上層服務與下層服務接口&#xff0c;同級接口 外部接口&#xff1a;比如你要從 別的網站 或 服務器 上獲取 資源或信息 &a…

SpringMVC框架學習筆記(四):模型數據 以及 視圖和視圖解析器

1 模型數據處理-數據放入 request 說明&#xff1a;開發中, 控制器/處理器中獲取的數據如何放入 request 域&#xff0c;然后在前端(VUE/JSP/...)取出顯 示 1.1 方式 1: 通過 HttpServletRequest 放入 request 域 &#xff08;1&#xff09;前端發送請求 <h1>添加主人…

使用dockerfile快速構建一個帶ssh的docker鏡像

不多說先給代碼 FROM ubuntu:22.04 # 基礎鏡像 可替換為其他鏡像 USER root RUN echo root:root |chpasswd RUN apt-get update -y \&& apt-get install -y git wget curl RUN apt-get install -y openssh-server vim && apt clean \&& rm -rf /tmp/…

在SpringBoot項目中實現切面執行鏈功能

1.定義切面執行鏈頂級接口 AspectHandler /*** 切面執行鏈**/ public interface AspectHandler {/*** 設置排除項* param excludes*/default void setExcludes(List<String> excludes) {}/*** 獲取排除項* return*/default List<String> getExcludes() {return ne…

事務與并發控制

事務&#xff08;Transaction0&#xff09;&#xff1a;要么全做&#xff0c;要么全不做&#xff1b; 事務ACID&#xff1a;原子性Atomicity&#xff1b;一致性Consistency&#xff1b;隔離性Isolation&#xff1b;持久性Durability&#xff1b; 并發操作問題&#xff1a; 1.…

基于RNN和Transformer的詞級語言建模 代碼分析 _generate_square_subsequent_mask

基于RNN和Transformer的詞級語言建模 代碼分析 _generate_square_subsequent_mask flyfish Word-level Language Modeling using RNN and Transformer word_language_model PyTorch 提供的 word_language_model 示例展示了如何使用循環神經網絡RNN(GRU或LSTM)和 Transforme…

汽車IVI中控開發入門及進階(二十二):video decoder視頻解碼芯片

前言: 視頻解碼器在許多汽車、專業和消費視頻應用中仍有需求。Analog Devices是模擬視頻產品領域的行業領導者,提供一系列視頻解碼器,可將標準(SD,standard definition)和高清(HD,High definition)分辨率的模擬視頻高質量轉換為MIPI或TTL格式的數字視頻數據。典型的應…

【AI大模型】如何讓大模型變得更聰明?基于時代背景的思考

【AI大模型】如何讓大模型變得更聰明 前言 在以前&#xff0c;AI和大模型實際上界限較為清晰。但是隨著人工智能技術的不斷發展&#xff0c;基于大規模預訓練模型的應用在基于AI人工智能的技術支持和幫助上&#xff0c;多個領域展現出了前所未有的能力。無論是自然語言處理、…

算法刷題筆記 差分矩陣(C++實現)

文章目錄 題目前言題目描述解題思路和代碼實現 題目前言 這道題是一道差分算法的拓展題型&#xff0c;是算法刷題筆記到目前為止我認為最困難的題目之一。因此&#xff0c;這篇題解博客的過程記錄也最為詳細&#xff0c;希望能夠為你帶來幫助。 題目描述 輸入一個n行m列的整…

JavaScript的垃圾回收機制

No.內容鏈接1Openlayers 【入門教程】 - 【源代碼示例300】 2Leaflet 【入門教程】 - 【源代碼圖文示例 150】 3Cesium 【入門教程】 - 【源代碼圖文示例200】 4MapboxGL【入門教程】 - 【源代碼圖文示例150】 5前端就業寶典 【面試題詳細答案 1000】 文章目錄 一、垃圾…

匹配字符串

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python提供了re模塊&#xff0c;用于實現正則表達式的操作。在實現時&#xff0c;可以使用re模塊提供的方法&#xff08;如search()、match()、finda…

深入理解Redis:多種操作方式詳解

Redis&#xff08;Remote Dictionary Server&#xff09;是一款高性能的開源鍵值存儲系統&#xff0c;廣泛應用于緩存、會話管理、實時分析等領域。它支持多種數據結構&#xff0c;如字符串、哈希、列表、集合和有序集合等&#xff0c;提供了豐富的操作命令。本篇博客將詳細介紹…

信息系統項目管理師0603:項目整合管理 — 考點總結(可直接理解記憶)

點擊查看專欄目錄 文章目錄 項目整合管理 — 考點總結(可直接理解記憶) 輸入、輸出、工具和技術 歷年考題直接考輸入,輸出、工具和技術的有17年11月第34、35,19年5月第34、35,20年11月27、28,21年5月第26,28,21年11月第28,22年5月第25,22年11月第22考題 項目章程是正…

CasaOS玩客云安裝全平臺高速下載器Gopeed并實現遠程訪問

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

BufferQueue 的工作原理

bufferQueue 是 Android 圖形棧中的一個核心組件,它在生產者和消費者之間傳遞緩沖區(buffer)。它通常用于圖形緩沖區管理,特別是在 SurfaceFlinger 和其他圖形相關的組件中。理解 BufferQueue 的工作原理對開發高性能圖形應用和解決圖形渲染問題非常有幫助。 BufferQueue …