国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

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

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

2022-03-01 22:54kl Redis

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

前言碎語

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

延遲隊列多種實現方式

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

redisson中的延遲隊列實現

怎么封裝便于業務使用。

1.首先定義一個延遲job,里面包含一個map參數,和隊列執行器的具體實現class,觸發任務執行時,map參數會被傳遞到具體的業務執行器實現內

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

2.定義一個延遲job執行器接口,業務需要實現這個接口,然后在execute方法內寫自己的業務邏輯

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

3.消費已經到點的延時job服務,通過job參數調用業務執行器實現

?
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服務

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * Created by kl on 2018/7/20.
 * Content :延時job服務
 */
@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);
    }
}

文末結語

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

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

延伸 · 閱讀

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

    Redis全量復制與部分復制示例詳解

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

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

    詳解Redis復制原理

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

    李留廣10222021-08-09
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

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

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

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

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

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

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

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

    xiaojin21cen10152021-07-27
  • Redisredis實現排行榜功能

    redis實現排行榜功能

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

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

    Redis的配置、啟動、操作和關閉方法

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

    大道化簡5312019-11-14
主站蜘蛛池模板: 国产精品污www一区二区三区 | 久久久久中文字幕 | 亚洲精品久久久久久下一站 | 国产在线精品一区 | 日韩电影一区二区三区 | 国产精品成人在线观看 | 国产性猛交xxxx免费看久久 | 亚洲视频第一页 | 五月天婷婷激情 | 最新电影在线高清免费完整观看视频 | 黑人精品欧美一区二区蜜桃 | 黄色四虎| 亚洲精品在线免费 | 国产综合免费视频 | 亚洲一区二区三区在线播放 | 国产片性视频免费播放 | 欧美一级片免费在线观看 | 一区二区高清 | 精品在线视频播放 | 日韩中文字幕无码一区二区三区 | 麻豆激情 | 日韩av电影在线观看 | 国产精品久久 | 久久久久国产一区二区三区四区 | 亚洲日韩中文字幕一区 | 国产精品一区在线 | 成年人视频在线观看免费 | 亚洲欧洲精品成人久久奇米网 | 国产免费一区二区 | 久久精彩视频 | 躁躁躁日躁夜夜躁 | 久久福利电影 | 国产偷窥老熟盗摄视频 | 波多一区二区 | 久久一日本道色综合久久 | 成人激情在线视频 | 国产精品久久久久久久久久久久久久 | 日韩在线观看 | 亚洲精品久久久久久久久久久 | 精品国产青草久久久久福利 | 91麻豆精品国产91久久久久久久久 |