Redisson延遲隊列RDelayedQueue的使用

在開發(fā)中,往往會遇到一些關(guān)于延時任務(wù)的需求浅役。例如

  1. 生成訂單30分鐘未支付溢谤,則自動取消
  2. 生成訂單60秒后,給用戶發(fā)短信
    對上述的任務(wù)瞻凤,我們給一個專業(yè)的名字來形容,那就是延時任務(wù)世杀。那么這里就會產(chǎn)生一個問題阀参,這個延時任務(wù)和定時任務(wù)的區(qū)別究竟在哪里呢?一共有如下幾點區(qū)別:
  • 定時任務(wù)有明確的觸發(fā)時間瞻坝,延時任務(wù)沒有
  • 定時任務(wù)有執(zhí)行周期蛛壳,而延時任務(wù)在某事件觸發(fā)后一段時間內(nèi)執(zhí)行杏瞻,沒有執(zhí)行周期
  • 定時任務(wù)一般執(zhí)行的是批處理操作是多個任務(wù),而延時任務(wù)一般是單個任務(wù)

解決方案:

  • 1衙荐、JDK的延遲隊列
  • 2捞挥、時間輪算法--HashedWheelTimer
  • 3、Redisson延遲隊列RDelayedQueue

前倆方案的優(yōu)缺點:

  • 優(yōu)點:
    效率高,任務(wù)觸發(fā)時間延遲時間比delayQueue低忧吟,代碼復雜度比delayQueue低砌函。
  • 缺點:
    (1)服務(wù)器重啟后,數(shù)據(jù)全部消失溜族,怕宕機 ??
    (2)集群擴展相當麻煩 ??
    (3)因為內(nèi)存條件限制的原因讹俊,比如下單未付款的訂單數(shù)太多,那么很容易就出現(xiàn)OOM異常

使用Redisson延遲隊列RDelayedQueue

1煌抒、 pom.xml

<!-- JDK 1.8+ compatible -->
<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.11.2</version>
</dependency> 


<!-- JDK 1.6+ compatible -->
<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>2.10.4</version>
</dependency> 

2仍劈、隊列中要存入的元素實體

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employer {
    private String name;
    private int age;
    private String wife;
    private Double salary;
    private String putTime;

    public void setPutTime() {
        this.putTime = new SimpleDateFormat("hh:mm:ss").format(new Date());
    }
}

3、生成訂單并放進延時隊列的類

package com.redisson;

import org.redisson.Redisson;
import org.redisson.api.RBlockingQueue;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.concurrent.TimeUnit;

public class RedisPutInQueue {
    public static void main(String args[]) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redissonClient = Redisson.create(config);
        RBlockingQueue<Employer> blockingFairQueue = redissonClient.getBlockingQueue("delay_queue");

        RDelayedQueue<Employer> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue);
        for (int i = 0; i < 10; i++) {
            try {
                //模擬間隔投遞消息
                Thread.sleep(1 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 一分鐘以后將消息發(fā)送到指定隊列
            //相當于1分鐘后取消訂單
            //延遲隊列包含callCdr 1分鐘寡壮,然后將其傳輸?shù)絙lockingFairQueue中
            //在1分鐘后就可以在blockingFairQueue 中獲取callCdr了
            Employer callCdr = new Employer();
            callCdr.setSalary(345.6);
            callCdr.setPutTime();
            delayedQueue.offer(callCdr, 1, TimeUnit.MINUTES);
            System.out.println("callCdr =================================> " + callCdr);
        }
        //在該對象不再需要的情況下贩疙,應該主動銷毀。
        // 僅在相關(guān)的Redisson對象也需要關(guān)閉的時候可以不用主動銷毀况既。
        delayedQueue.destroy();

        //redissonClient.shutdown();
    }
}

4这溅、取消訂單的操作類

package com.redisson;

import org.redisson.Redisson;
import org.redisson.api.RBlockingQueue;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.text.SimpleDateFormat;
import java.util.Date;

public class RedisOutFromQueue {
    public static void main(String args[]) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redissonClient = Redisson.create(config);
        RBlockingQueue<Employer> blockingFairQueue = redissonClient.getBlockingQueue("delay_queue");
        RDelayedQueue<Employer> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue);
        while (true) {
            Employer callCdr = null;
            try {
                callCdr = blockingFairQueue.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("訂單取消時間:" + new SimpleDateFormat("hh:mm:ss").format(new Date()) + "==訂單生成時間" + callCdr.getPutTime());
        }
    }
}


參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坏挠,隨后出現(xiàn)的幾起案子芍躏,更是在濱河造成了極大的恐慌,老刑警劉巖降狠,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異庇楞,居然都是意外死亡榜配,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門吕晌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛋褥,“玉大人,你說我怎么就攤上這事睛驳±有模” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵乏沸,是天一觀的道長淫茵。 經(jīng)常有香客問我,道長蹬跃,這世上最難降的妖魔是什么匙瘪? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上丹喻,老公的妹妹穿的比我還像新娘薄货。我一直安慰自己,他們只是感情好碍论,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布谅猾。 她就那樣靜靜地躺著,像睡著了一般鳍悠。 火紅的嫁衣襯著肌膚如雪赊瞬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天贼涩,我揣著相機與錄音巧涧,去河邊找鬼。 笑死遥倦,一個胖子當著我的面吹牛谤绳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袒哥,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缩筛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了堡称?” 一聲冷哼從身側(cè)響起瞎抛,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎却紧,沒想到半個月后桐臊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡晓殊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年断凶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巫俺。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡认烁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出介汹,到底是詐尸還是另有隱情却嗡,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布嘹承,位于F島的核電站窗价,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赶撰。R本人自食惡果不足惜舌镶,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一柱彻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧餐胀,春花似錦哟楷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至墨技,卻和暖如春惩阶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扣汪。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工断楷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崭别。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓冬筒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茅主。 傳聞我的和親對象是個殘疾皇子舞痰,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 延時任務(wù)有別于定式任務(wù),定式任務(wù)往往是固定周期的诀姚,有明確的觸發(fā)時間响牛。而延時任務(wù)一般沒有固定的開始時間,它常常是由一...
    jiangmo閱讀 20,159評論 4 16
  • 源起 大家可能都遇到過類似的需求: 生成訂單60秒后,給用戶發(fā)短信 下單之后15分鐘,如果用戶不付款就關(guān)閉訂單 解...
    jsondream閱讀 13,450評論 8 14
  • 文章原創(chuàng)作者:北京嘩啦啦 基礎(chǔ)架構(gòu)部架構(gòu)師 王曉鵬文章推薦人:程超 一赫段、背景 一款技術(shù)產(chǎn)品必定有其使用場景呀打,不然代...
    小程故事多閱讀 4,318評論 3 15
  • 這篇文章將介紹什么是阻塞隊列,以及Java中阻塞隊列的4種處理方式瑞佩,并介紹Java 7中提供的7種阻塞隊列聚磺,最后分...
    先生zeng閱讀 794評論 0 2
  • 從最初的同頻與19人和人生成長預備群的家人結(jié)緣,因為同頻才會遇見炬丸,每位朋友的文字,深深吸引著我蜒蕾,看似寫作稠炬,實際是在...
    鄭馨馳閱讀 339評論 0 5