中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

dw做網(wǎng)站時怎么在圖片上加字東莞發(fā)布最新通告

dw做網(wǎng)站時怎么在圖片上加字,東莞發(fā)布最新通告,網(wǎng)站開發(fā)人員的要求,花都網(wǎng)站建設(shè)信科網(wǎng)絡(luò)🏷?個人主頁:牽著貓散步的鼠鼠 🏷?系列專欄:Java全棧-專欄 🏷?個人學(xué)習(xí)筆記,若有缺誤,歡迎評論區(qū)指正 目錄 1.前言 2.Redis如何實現(xiàn)延遲任務(wù)? 3.代碼實現(xiàn) 3.1. 過期鍵通知事…

🏷?個人主頁:牽著貓散步的鼠鼠?

🏷?系列專欄:Java全棧-專欄

🏷?個人學(xué)習(xí)筆記,若有缺誤,歡迎評論區(qū)指正

目錄

1.前言

2.Redis如何實現(xiàn)延遲任務(wù)?

3.代碼實現(xiàn)

3.1. 過期鍵通知事件實現(xiàn)

3.2. 使用ZSet實現(xiàn)延遲任務(wù)

3.3 使用Redisson的延時隊列(常用)

4.Redis實現(xiàn)延遲任務(wù)優(yōu)缺點分析

5. 總結(jié)


1.前言

延遲任務(wù)(Delayed Task)是指在未來的某個時間點,執(zhí)行相應(yīng)的任務(wù)。也就是說,延遲任務(wù)是一種計劃任務(wù),它被安排在特定的時間后執(zhí)行,而不是立即執(zhí)行。

延遲任務(wù)的常見使用場景有以下幾個:

  1. 定時發(fā)送通知或消息
    • 發(fā)送定時短信、郵件或應(yīng)用內(nèi)消息,如注冊確認、訂單狀態(tài)更新、促銷活動通知等。
    • 定時推送新聞、天氣預(yù)報、股票價格等實時信息。
  2. 異步處理和后臺任務(wù)
    • 將耗時的操作安排為延遲任務(wù),避免阻塞主線程或用戶界面,提高系統(tǒng)的響應(yīng)性能。
    • 執(zhí)行批量數(shù)據(jù)處理,如日志分析、數(shù)據(jù)報表生成等。
  3. 緩存管理和過期處理
    • 定時清理過期的緩存數(shù)據(jù),釋放存儲空間。
    • 更新緩存中的數(shù)據(jù),保持數(shù)據(jù)的時效性和準確性。
  4. 計劃任務(wù)和定時調(diào)度
    • 在特定時間執(zhí)行系統(tǒng)維護任務(wù),如數(shù)據(jù)庫備份、系統(tǒng)更新等。
    • 定時啟動或關(guān)閉服務(wù),以節(jié)約資源或滿足業(yè)務(wù)需求。
  5. 訂單和支付處理
    • 在用戶下單后的一段時間內(nèi),如果用戶未支付,則自動取消訂單。
    • 定時檢查訂單的支付狀態(tài),并更新相應(yīng)的訂單信息。
  6. 重試和失敗恢復(fù)機制
    • 當(dāng)某個操作失敗時,可以在延遲一段時間后自動重試,以提高成功率。
    • 實現(xiàn)分布式鎖的超時釋放,避免死鎖情況。
  7. 提醒和日程管理
    • 設(shè)置日程提醒,如會議、生日、紀念日等。
    • 定時提醒用戶完成任務(wù)或進行某項活動。
  8. 定時數(shù)據(jù)采集和上報
    • 定期從傳感器、設(shè)備或外部系統(tǒng)中采集數(shù)據(jù)。
    • 定時上報應(yīng)用的使用情況、統(tǒng)計數(shù)據(jù)或用戶行為分析。

2.Redis如何實現(xiàn)延遲任務(wù)?

Redis 本身并沒有直接提供延遲任務(wù)的功能,但可以通過一些策略和手段,在 Redis 中手動實現(xiàn)延遲任務(wù)

使用 Redis 實現(xiàn)延遲任務(wù)的主要手段有以下幾個:

1. 使用過期鍵的事件通知執(zhí)行延時任務(wù):開啟過期鍵通知,當(dāng) Redis 中鍵值過期時觸發(fā)時間,在事件中實現(xiàn)延遲代碼,但因為 Redis 的 Key 過期時不會被及時刪除,所以這個過期事件也不保證可以立即觸發(fā),所以此方式很少用來實現(xiàn)延遲任務(wù)(因為極其不穩(wěn)定)。

?2. 使用 ZSet 執(zhí)行延時任務(wù):在 ZSet 中插入延遲執(zhí)行時間和任務(wù) ID,如下命令所示:

ZADD delay_tasks <timestamp> <task_id>

然后,啟動一個后臺線程或者定時任務(wù),定期通過 ZRANGEBYSCORE 命令從有序集合中獲取已到達執(zhí)行時間的任務(wù),即分數(shù)小于或等于當(dāng)前時間的任務(wù),進行執(zhí)行即可實現(xiàn)延時任務(wù)。

3. 使用 Redisson 執(zhí)行延遲任務(wù):在 Redisson 框架中,提供了一個 RDelayedQueue 用于實現(xiàn)延遲隊列,使用簡單方便,推薦使用。

3.代碼實現(xiàn)

3.1. 過期鍵通知事件實現(xiàn)

Redis 提供了鍵空間通知功能,當(dāng)某個鍵發(fā)生變化(過期)時,可以發(fā)送通知。你可以結(jié)合 EXPIRE 過期命令和鍵空間通知來實現(xiàn)延遲任務(wù)。

當(dāng)為某個鍵設(shè)置過期時間時,一旦該鍵過期,Redis 會發(fā)送一個通知。你可以訂閱這個通知,并在接收到通知時執(zhí)行任務(wù)。但這種方法可能不夠精確,且依賴于 Redis 的內(nèi)部機制。

它的實現(xiàn)步驟是:

  1. 設(shè)置開啟 Redis 過期鍵通知事件,可以通過執(zhí)行“CONFIG SET notify-keyspace-events KEA”命令來動態(tài)開啟鍵空間通知功能,而無需重啟 Redis 服務(wù)器。
  2. 設(shè)置過期鍵,可以通過命令“SET mykey "myvalue" EX 3”設(shè)置某個 key 3 秒后過期(3s 后執(zhí)行)。
  3. 編寫一個監(jiān)聽程序來訂閱 Redis 的鍵空間通知。這可以通過使用 Redis 的發(fā)布/訂閱功能來實現(xiàn),具體實現(xiàn)代碼如下(以 Jedis 框架使用為例):
import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisPubSub;  public class RedisKeyspaceNotifier {  public static void main(String[] args) {  // 創(chuàng)建Jedis實例  Jedis jedis = new Jedis("localhost", 6379);  // 配置鍵空間通知(通常這一步在Redis配置文件中完成,但也可以在運行時配置)  jedis.configSet("notify-keyspace-events", "KEA");  // 訂閱鍵空間通知  jedis.subscribe(new KeyspaceNotificationSubscriber(), "__keyevent@0__:expired");  }  static class KeyspaceNotificationSubscriber extends JedisPubSub {  @Override  public void onMessage(String channel, String message) {  System.out.println("Received message from channel: " + channel + ", message: " + message);  // 在這里處理接收到的鍵空間通知  // 例如,如果message是一個需要處理的任務(wù)ID,你可以在這里觸發(fā)相應(yīng)的任務(wù)處理邏輯  }  @Override  public void onSubscribe(String channel, int subscribedChannels) {  System.out.println("Subscribed to channel: " + channel);  }  @Override  public void onUnsubscribe(String channel, int subscribedChannels) {  System.out.println("Unsubscribed from channel: " + channel);  }  }  
}

但因為 Redis 的 Key 過期時不會被及時刪除,Redis 采用的是惰性刪除和定期刪除,所以這個過期事件也不保證可以立即觸發(fā),所以此方式很少用來實現(xiàn)延遲任務(wù)(因為極其不穩(wěn)定)。

3.2. 使用ZSet實現(xiàn)延遲任務(wù)

可以將任務(wù)及其執(zhí)行時間作為成員和分數(shù)存儲在 ZSET 中,然后,使用一個后臺任務(wù)(如定時任務(wù)或守護進程)定期檢查 ZSET,查找分數(shù)(即執(zhí)行時間)小于或等于當(dāng)前時間的成員,并執(zhí)行相應(yīng)的任務(wù)。執(zhí)行后,從 ZSET 中刪除該成員,具體實現(xiàn)代碼如下:

import redis.clients.jedis.Jedis;  import java.util.Set;  public class RedisDelayedTaskDemo {  private static final String ZSET_KEY = "delayed_tasks";  private static final String REDIS_HOST = "localhost";  private static final int REDIS_PORT = 6379;  public static void main(String[] args) {  Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT);  // 添加延遲任務(wù)  addDelayedTask(jedis, "task1", System.currentTimeMillis() / 1000 + 5); // 5秒后執(zhí)行  addDelayedTask(jedis, "task2", System.currentTimeMillis() / 1000 + 10); // 10秒后執(zhí)行  // 模擬定時任務(wù)檢查器  new Thread(() -> {  while (true) {  try {  // 檢查并執(zhí)行到期的任務(wù)  checkAndExecuteTasks(jedis);  Thread.sleep(1000); // 每秒檢查一次  } catch (InterruptedException e) {  e.printStackTrace();  }  }  }).start();  }  private static void addDelayedTask(Jedis jedis, String task, long executeTime) {  jedis.zadd(ZSET_KEY, executeTime, task);  System.out.println("Added task: " + task + " with execution time: " + executeTime);  }  private static void checkAndExecuteTasks(Jedis jedis) {  long currentTime = System.currentTimeMillis() / 1000;  Set<String> tasks = jedis.zrangeByScore(ZSET_KEY, 0, currentTime);  for (String task : tasks) {  jedis.zrem(ZSET_KEY, task); // 從有序集合中移除任務(wù)  executeTask(task); // 執(zhí)行任務(wù)  }  }  private static void executeTask(String task) {  System.out.println("Executing task: " + task);  // 在這里添加實際的任務(wù)執(zhí)行邏輯  }  
}

在這個示例中,我們首先使用 addDelayedTask 方法向 Redis 的有序集合中添加任務(wù),并設(shè)置它們的執(zhí)行時間。然后,我們啟動一個線程來模擬定時任務(wù)檢查器,它會每秒檢查一次是否有任務(wù)到期,并執(zhí)行到期的任務(wù)。

3.3 使用Redisson的延時隊列(常用)

在 Redisson 框架中,提供了一個 RDelayedQueue 用于實現(xiàn)延遲隊列,使用簡單方便,推薦使用,它的具體實現(xiàn)如下:

import org.redisson.Redisson;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;import java.util.concurrent.TimeUnit;public class RDelayedQueueDemo {public static void main(String[] args) throws InterruptedException {// 創(chuàng)建 Redisson 客戶端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);// 獲取延遲隊列RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue("delayedQueue");// 添加延遲任務(wù)delayedQueue.offer("task1", 5, TimeUnit.SECONDS);// 監(jiān)聽并處理延遲任務(wù)Thread listenerThread = new Thread(() -> {while (true) {try {// 通過 take 方法等待并獲取到期的任務(wù)String task = delayedQueue.take();System.out.println("Handle task: " + task);} catch (InterruptedException e) {break;}}});listenerThread.start();}
}

在上述示例中,我們首先創(chuàng)建了一個 Redisson 客戶端,通過配置文件指定了使用單節(jié)點 Redis 服務(wù)器。然后,我們獲取一個延遲隊列 RDelayedQueue,并添加一個延遲任務(wù),延遲時間為 5 秒,接著,我們通過線程監(jiān)聽并處理延遲隊列中的任務(wù)。

4.Redis實現(xiàn)延遲任務(wù)優(yōu)缺點分析

優(yōu)點:

  1. 輕量級與高性能:Redis 是一個內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),因此讀寫速度非???。將任務(wù)信息存儲在 Redis 中可以迅速地進行存取操作。
  2. 簡單易用:Redis 的 API 簡潔明了,易于集成到現(xiàn)有的應(yīng)用系統(tǒng)中。

缺點:

  1. 精度有限:Redis 的延遲任務(wù)依賴于系統(tǒng)的定時檢查機制,而不是精確的定時器。這意味著任務(wù)的執(zhí)行可能會有一定的延遲,特別是在系統(tǒng)負載較高或檢查間隔較長的情況下。
  2. 功能有限:與專業(yè)的任務(wù)調(diào)度系統(tǒng)相比,Redis 提供的延遲任務(wù)功能可能相對簡單。對于復(fù)雜的任務(wù)調(diào)度需求,如任務(wù)依賴、任務(wù)優(yōu)先級等,可能需要額外的邏輯來實現(xiàn)。
  3. 穩(wěn)定性較差:使用 Redis 實現(xiàn)延遲任務(wù)沒有重試機制和 ACK 確認機制,所以穩(wěn)定性比較差。
  4. 單點故障風(fēng)險:如果沒有正確配置 Redis 集群或主從復(fù)制,那么單個 Redis 實例的故障可能導(dǎo)致整個延遲任務(wù)系統(tǒng)的癱瘓。

5. 總結(jié)

以上我們總結(jié)了使用redis實現(xiàn)延時任務(wù)的幾種方案,在一些簡單的場景可以直接使用redisson提供的延時隊列來實現(xiàn)延時任務(wù),非常容易上手。在復(fù)雜大型的場景下,還是推薦使用專業(yè)的任務(wù)調(diào)度系統(tǒng),如xxl-job,Quartz等。

http://www.risenshineclean.com/news/27056.html

相關(guān)文章:

  • 外國風(fēng)格網(wǎng)站建設(shè)電話搜索引擎排名google
  • html在線編輯器預(yù)覽網(wǎng)頁版網(wǎng)站整站優(yōu)化公司
  • 營銷網(wǎng)站參考今日熱搜榜排名
  • 濱州做網(wǎng)站建設(shè)的公司新聞 最新消息
  • 怎樣在美國做網(wǎng)站百度網(wǎng)站大全
  • 網(wǎng)站建設(shè)是幾個點的發(fā)票seo流量排名軟件
  • 衡陽衡南網(wǎng)站建設(shè)2022今天剛剛發(fā)生地震了
  • 微網(wǎng)站與微信的關(guān)系蘇州seo安嚴博客
  • 域名訪問網(wǎng)站的知識正規(guī)的微信推廣平臺
  • 平臺公司有哪些windows優(yōu)化大師有毒嗎
  • 網(wǎng)站搜索防止攻擊廣告代運營
  • 有沒有catia做幕墻的網(wǎng)站色目人
  • 有什么做節(jié)能報告的網(wǎng)站網(wǎng)絡(luò)營銷和網(wǎng)上銷售的區(qū)別
  • 石家莊視頻網(wǎng)站建設(shè)公司百度大數(shù)據(jù)平臺
  • 怎么用服務(wù)器ip做網(wǎng)站百家號優(yōu)化
  • 武漢房價深圳市seo網(wǎng)絡(luò)推廣哪家好
  • 大連網(wǎng)站建設(shè)設(shè)計上海牛巨微seo優(yōu)化
  • php做電影網(wǎng)站有哪些網(wǎng)絡(luò)營銷以什么為中心
  • 網(wǎng)站建設(shè)衤金手指下拉10搜索引擎優(yōu)化的具體措施
  • 臨沂哪里做網(wǎng)站比較好seo是什么專業(yè)的課程
  • 網(wǎng)站黨組織規(guī)范化建設(shè)開展情況網(wǎng)站怎么做出來的
  • 愛做奈官方網(wǎng)站優(yōu)化公司哪家好
  • 怎樣做百度網(wǎng)站推廣百度6大核心部門
  • visual studio做網(wǎng)站哪個公司做網(wǎng)站推廣最好
  • 網(wǎng)站關(guān)鍵詞可以添加嗎seo關(guān)鍵詞外包
  • 獵頭公司應(yīng)堅持的原則有超級優(yōu)化空間
  • 東莞建站seo怎么收費的
  • 網(wǎng)站中flash怎么做的游戲推廣怎么做引流
  • 做網(wǎng)站什么商品好軟文網(wǎng)站模板
  • 河田鎮(zhèn)建設(shè)局網(wǎng)站百度知道app