一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Redis - 分布式利器redis及redisson的延遲隊列實踐

分布式利器redis及redisson的延遲隊列實踐

2022-03-01 22:54kl Redis

這篇文章為大家主要介紹了分布式利器redis及redisson的延遲隊列實踐,搜遍全網(wǎng)好像還沒有使用redisson的延遲隊列的,redisson作為一個分布式利器,這么好用的工具沒人用有點可惜

前言碎語

首先說明下需求,一個用戶中心產(chǎn)品,用戶在試用產(chǎn)品有三天的期限,三天到期后準(zhǔn)時準(zhǔn)點通知用戶,試用產(chǎn)品到期了。這個需求如果不是準(zhǔn)時通知,而是每天定點通知就簡單了。如果需要準(zhǔn)時通知就只能上延遲隊列了。使用場景除了如上,典型的業(yè)務(wù)場景還有電商中的延時未支付訂單失效等等。

延遲隊列多種實現(xiàn)方式

  • 1.如基于RabbitMQ的隊列ttl+死信路由策略:通過設(shè)置一個隊列的超時未消費時間,配合死信路由策略,到達時間未消費后,回會將此消息路由到指定隊列
  • 2.基于RabbitMQ延遲隊列插件(rabbitmq-delayed-message-exchange):發(fā)送消息時通過在請求頭添加延時參數(shù)(headers.put("x-delay", 5000))即可達到延遲隊列的效果
  • 3.使用redis的zset有序性,輪詢zset中的每個元素,到點后將內(nèi)容遷移至待消費的隊列,(redisson已有實現(xiàn))
  • 4.使用redis的key的過期通知策略,設(shè)置一個key的過期時間為延遲時間,過期后通知客戶端

redisson中的延遲隊列實現(xiàn)

怎么封裝便于業(yè)務(wù)使用。

1.首先定義一個延遲job,里面包含一個map參數(shù),和隊列執(zhí)行器的具體實現(xiàn)class,觸發(fā)任務(wù)執(zhí)行時,map參數(shù)會被傳遞到具體的業(yè)務(wù)執(zhí)行器實現(xiàn)內(nèi)

?
1
2
3
4
5
6
7
8
/**
 * Created by kl on 2018/7/20.
 * Content :延時job
 */
public class DelayJob {
    private Map jobParams;//job執(zhí)行參數(shù)
    private Class aClass;//具體執(zhí)行實例實現(xiàn)
}

2.定義一個延遲job執(zhí)行器接口,業(yè)務(wù)需要實現(xiàn)這個接口,然后在execute方法內(nèi)寫自己的業(yè)務(wù)邏輯

?
1
2
3
4
5
6
7
/**
 * Created by kl on 2018/7/20.
 * Content :延時job執(zhí)行器接口
 */
public interface ExecuteJob {
     void execute(DelayJob job);
}

3.消費已經(jīng)到點的延時job服務(wù),通過job參數(shù)調(diào)用業(yè)務(wù)執(zhí)行器實現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Component
public class JobTimer {
    static final String jobsTag = "customer_jobtimer_jobs";
    @Autowired
    private RedissonClient client;
    @Autowired
    private ApplicationContext context;
    ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
    @PostConstruct
    public void startJobTimer() {
        RBlockingQueueblockingQueue = client.getBlockingQueue(jobsTag);
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        DelayJob job = blockingQueue.take();
                        executorService.execute(new ExecutorTask(context, job));
                    } catch (Exception e) {
                        e.printStackTrace();
                        try {
                            TimeUnit.SECONDS.sleep(60);
                        } catch (Exception ex) {
                        }
                    }
                }
            }
        }.start();
    }
    class ExecutorTask implements Runnable {
        private ApplicationContext context;
        private DelayJob delayJob;
        public ExecutorTask(ApplicationContext context, DelayJob delayJob) {
            this.context = context;
            this.delayJob = delayJob;
        }
        @Override
        public void run() {
            ExecuteJob service = (ExecuteJob) context.getBean(delayJob.getaClass());
            service.execute(delayJob);
        }
    }
}

4.封裝延時job服務(wù)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * Created by kl on 2018/7/20.
 * Content :延時job服務(wù)
 */
@Component
public class DelayJobService {
    @Autowired
    private RedissonClient client;
    public void submitJob(DelayJob job, Long delay, TimeUnit timeUnit){
        RBlockingQueueblockingQueue = client.getBlockingQueue(JobTimer.jobsTag);
        RDelayedQueue delayedQueue = client.getDelayedQueue(blockingQueue);
        delayedQueue.offer(job,delay,timeUnit);
    }
}

文末結(jié)語

redisson作為一個分布式利器,這么好用的工具沒人用有點可惜,還有一個原因是有個想法,想將延遲隊列這個功能封裝成一個spring boot的start依賴,然后開源出來,造福四方,希望大家以后多多支持服務(wù)器之家!

原文鏈接:http://www.kailing.pub/article/index/arcid/207.html

延伸 · 閱讀

精彩推薦
  • RedisRedis全量復(fù)制與部分復(fù)制示例詳解

    Redis全量復(fù)制與部分復(fù)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復(fù)制與部分復(fù)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Redis爬蟲具有一定的參考學(xué)習(xí)...

    豆子先生5052019-11-27
  • Redis詳解Redis復(fù)制原理

    詳解Redis復(fù)制原理

    與大多數(shù)db一樣,Redis也提供了復(fù)制機制,以滿足故障恢復(fù)和負載均衡等需求。復(fù)制也是Redis高可用的基礎(chǔ),哨兵和集群都是建立在復(fù)制基礎(chǔ)上實現(xiàn)高可用的...

    李留廣10222021-08-09
  • RedisRedis 事務(wù)知識點相關(guān)總結(jié)

    Redis 事務(wù)知識點相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構(gòu),能幫助我們實現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實現(xiàn)數(shù)據(jù)庫讀寫分離的相關(guān)資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具...

    一線碼農(nóng)5812019-11-18
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • Redisredis實現(xiàn)排行榜功能

    redis實現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現(xiàn)排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis的配置、啟動、操作和關(guān)閉方法

    Redis的配置、啟動、操作和關(guān)閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關(guān)閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
主站蜘蛛池模板: 免费福利资源站在线视频 | 国产欧美一区二区精品性色 | 国产精品合集久久久久青苹果 | 男人疯狂擦进女人下面 | 禁忌4中文 | caonila国产在线观看 | 十大免费b2b网站 | boobsmilking流奶水野战 | 好大好长好紧爽免费 | 嫩交18xxxx| 91大神大战高跟丝袜美女 | 欧美日韩一区二区综合 | 精品AV综合导航 | aigao视频| 99视频免费| 无人区乱码区1卡2卡三卡在线 | 手机看片1024国产 | 国产精品第1页在线播放 | bban女同系列022在线观看 | 亚洲第五页| 国产精品福利一区二区亚瑟 | 午夜dj免费视频观看社区 | 女人zooxx禽交 | 久久精品热在线观看30 | 国产高清国内精品福利 | 脱jk裙的美女露小内内无遮挡 | 国产综合亚洲欧美日韩一区二区 | 国产精品对白刺激久久久 | 精品精品久久宅男的天堂 | 亚洲精品国产精品麻豆99 | 国产精品理论片在线观看 | 国产在线视频一区二区三区 | 亚洲人成网站在线观看90影院 | 色综合欧美色综合七久久 | 18日本人| 免费草比视频 | 操老妇| 日韩视频一区二区 | 日本国产一区二区三区 | 小sao货ji巴cao死你视频 | 国产成人精品免费视频软件 |