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

服務(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
主站蜘蛛池模板: 暖暖暖免费观看在线观看 | 日本韩国推理片免费观看网站 | 网站在线观看 | 亚洲精品国产一区二区第一页 | 亚洲精品中文 | 国产v在线在线观看羞羞答答 | 香蕉久久久久久狠狠色 | 2020国产精品永久在线观看 | 色综合视频在线 | 日本高清va不卡视频在线观看 | 5555kkkk香蕉在线观看 | 香蕉久久久久久狠狠色 | 国产高清不卡视频在线播放 | 很黄的网站在线观看 | 蛮荒的童话未删减在线观看 | 欧美一级激情 | 高清免费毛片 | 国产精品久久99 | 成人网免费视频 | 亚洲酒色1314狠狠做 | 国精视频一区二区视频 | 成年人视频在线免费看 | 日韩欧美高清视频 | 日韩免费一级片 | 高清在线免费观看 | 日本hdxxxx护士 | 婚前试爱免费观看 | 扒开斗罗美女了的胸罩和内裤漫画 | 护士xxxx | 五月天婷婷精品免费视频 | 丝袜老师好湿好紧我要进去了 | 亚洲剧情在线观看 | 亚洲日本中文字幕天天更新 | 皇上好大好硬好涨好深好爽 | 日韩精品视频美在线精品视频 | 99国内精品久久久久久久黑人 | 男女做受快插大片 | 欧美人曾交 | 草草免费观看视频在线 | 午夜国产精品视频 | 久久草福利自拍视频在线观看 |