針對定時任務中不同服務器易出現對同一條數據的重復處理,處理方法如下:
若無需考慮效率,可在 redis 中加一個鎖。在定時任務開頭判斷鎖狀態,若有鎖,直接 return,沒有鎖的話則加上鎖并向下執行,在任務執行的最后刪除鎖。
若需要考慮效率就比較麻煩了,如幾臺服務器需要同時處理一個數據庫中的數據,為了防止數據被重復處理,可做一個讀取的定時任務,任務開頭加鎖,讀取并 push 到一個 redis 隊列中;再做一個處理的定時任務,pop redis 隊列中的數據挨個進行處理,當 redis 隊列被 pop 空以后,則把鎖刪掉。
但這種處理方式仍有一定的幾率遇到一臺服務進入讀取服務判斷鎖狀態的時候另一臺服務器正好處理完最后一條隊列信息把鎖刪掉,導致鎖失效的情況。然幾率較小,且未想到更好的處理方式,目前我的程序仍在這樣處理。