Redis解決分布式定時任務重複執行問題

2022-03-15 18:58:16 字數 1730 閱讀 2550

問題描述:有乙個定時任務是每週一給客戶傳送郵件的功能, 後台部署了2臺伺服器,所以客戶 收到了2封重複郵件。

解決思路:

分布式鎖一般有三種實現方式:1. 資料庫樂觀鎖;2. 基於redis的分布式鎖;3. 基於zookeeper的分布式鎖。

這裡使用一台redis伺服器來解決上面的問題。

**部分比較簡單:

加鎖 :主要是給多個定時任務給redis加鎖(key),如果存在key,則加鎖失敗,如果不存在,則嘗試去加鎖,返回加鎖結果。 

解鎖:設定一下過期時間為20秒(可根據任務首席執行官短調整),過期後自動釋放掉。這裡就不去**裡面釋放鎖了。

private

static

final string lock_success = "ok";

private

static

final string set_if_not_exist = "nx";

private

static

final string set_with_expire_time = "px";

private

static

final long release_success = 1l;

/*** 嘗試獲取分布式鎖**

@param

jedis redis客戶端

* @param

lockkey 鎖

* @param

requestid 請求標識

* @param

expiretime 超期時間

* @return

是否獲取成功

*/public

static

boolean trygetdistributedlock(jedis jedis, string lockkey, string requestid, int

expiretime)

return

false

; }

測試 (同時啟動4個服務,每個服務上面啟動三個同樣的定時任務)

//

每分鐘執行一次

static

final string cron1 = "0 */1 * * * ?";

@scheduled(cron =cron1)

public

void

testredis1()

@scheduled(cron =cron1)

public

void

testredis2()

@scheduled(cron =cron1)

public

void

testredis3()

//執行redis

private

string doredis()

else

return

msg;

}

測試結果

觀察到每一分鐘, 3x4個定時任務中,只有乙個能獲取到鎖,可以去操作業務,其他同樣的定時任務失敗了 。

總結:後面會具體總結一下分布式鎖相關的內容

redis解決分布式定時任務問題

場景分析 多伺服器針對於定時任務帶來的問題,保證任務只在乙個伺服器上在執行。解決方案1 redis bean public defaultredisscript redisscript scheduled cron 40 public void testscheduled else catch in...

分布式定時任務

在做springboot專案的時候,需要定時做對賬任務。但因為專案是集群部署,就存在多個pod例項的定時任務同時執行,存在重複性。怎麼保證集群中不重複地完成定時任務?下面給出本人總結的方案。對賬任務表 merchant idname is done 是否對賬,0沒有對賬 1商家102 商家20 3商...

分布式定時任務元件對比

描述xxl job elastic job lite saturn 主要作者 大眾點評徐雪裡 當當網張亮 唯品會開源,基於elastic job 特殊環境 mysql5.7 zookeeper 同elastic job 特殊功能 策略豐富,支援分片 子任務 支援分片,分片策略比xxl job豐富,支...