上一篇(靈感來襲,基於Redis的分佈式延遲隊列)講述了基於Java DelayQueue和Redis實現了分佈式延遲隊列,這種方案實現比較簡單,應用於延遲小,消息量不大的場景是沒問題的,畢竟Java DelayQueue是佔用內存的。針對現用方案的不足,因而利用Redis的Sorted Set數據結構簡單實現分佈式延遲隊列。html
根據queueName分別建立中轉隊列(Sorted Set)和 目標隊列key值,其中queueSize是中轉隊列的大小。redis
根據延遲消息的hash值,平均分配到不一樣的中轉隊列(Sorted Set)中去。數據結構
經過分佈式鎖來鎖定惟一的線程來執行延遲消息遷移到目標隊列的操做。遍歷所有的中轉隊列,由於延遲消息是和延遲時間戳關聯的,使用ZRANGEBYSCORE命令,取出延遲時間小於當前時間的50條消息並經過LPUSH命令放入目標隊列裏。分佈式
經過RPOP命令不斷的從目標隊列獲取延遲消息,執行相應的消費邏輯。線程
本文描述的實現方案還有諸多異常狀況還沒有考慮,好比生產者發送失敗、消費者消費失敗的狀況,沒法保證極端狀況下生產者和消費者兩端的數據一致性。該方案能夠知足業務量不是很大、延遲時間較長、容許部分數據可能丟失的場景,好比用戶簽到提醒,能夠根據用戶簽到的時間,次日在相應的時間點推送消息提醒用戶繼續簽到。設計