欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年03月01日 13:02:18   作者:kl  
這篇文章為大家主要介紹了分布式利器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)

/**
 * 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ù)邏輯

/**
 * 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)

@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ù)

/**
 * 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依賴,然后開源出來,造福四方,希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis中緩存穿透/擊穿/雪崩問題和解決方法

    Redis中緩存穿透/擊穿/雪崩問題和解決方法

    大家好,本篇文章主要講的是Redis中緩存穿透/擊穿/雪崩問題和解決方法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下哦,方便下次瀏覽
    2021-12-12
  • 從MySQL到Redis的簡單數(shù)據(jù)庫遷移方法

    從MySQL到Redis的簡單數(shù)據(jù)庫遷移方法

    這篇文章主要介紹了從MySQL到Redis的簡單數(shù)據(jù)庫遷移方法,注意Redis數(shù)據(jù)庫基于內(nèi)存,并不能代替?zhèn)鹘y(tǒng)數(shù)據(jù)庫,需要的朋友可以參考下
    2015-06-06
  • Redis筆記點贊排行榜的實現(xiàn)示例

    Redis筆記點贊排行榜的實現(xiàn)示例

    探店筆記類似點評網(wǎng)站的評價,本文主要介紹了Redis筆記點贊排行榜的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 使用 Redis 流實現(xiàn)消息隊列的代碼

    使用 Redis 流實現(xiàn)消息隊列的代碼

    這篇文章主要介紹了使用 Redis 流實現(xiàn)消息隊列,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • Redis為什么要存兩次數(shù)據(jù)

    Redis為什么要存兩次數(shù)據(jù)

    這篇文章主要介紹了Redis為什么要存兩次數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2021-02-02
  • Redis整合SpringBoot的RedisTemplate實現(xiàn)類(實例詳解)

    Redis整合SpringBoot的RedisTemplate實現(xiàn)類(實例詳解)

    這篇文章主要介紹了Redis整合SpringBoot的RedisTemplate實現(xiàn)類,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 嵌入式Redis服務(wù)器在Spring Boot測試中的使用教程

    嵌入式Redis服務(wù)器在Spring Boot測試中的使用教程

    這篇文章主要介紹了嵌入式Redis服務(wù)器在Spring Boot測試中的使用,本文通過實例代碼場景分析給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07
  • Redis主從復(fù)制操作和配置詳情

    Redis主從復(fù)制操作和配置詳情

    這篇文章主要介紹了Redis主從復(fù)制操作和配置詳情,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 為啥懶 Redis 是更好的 Redis

    為啥懶 Redis 是更好的 Redis

    本文是由zicode, 李中凱, 無若翻譯的英文文章Lazy Redis is better Redis,小編認為非常不錯,這里推薦給大家
    2018-07-07
  • redis的持久化和緩存機制解讀

    redis的持久化和緩存機制解讀

    這篇文章主要介紹了redis的持久化和緩存機制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論