最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分布式利器redis及redisson的延遲隊(duì)列實(shí)踐

 更新時(shí)間:2022年03月01日 13:02:18   作者:kl  
這篇文章為大家主要介紹了分布式利器redis及redisson的延遲隊(duì)列實(shí)踐,搜遍全網(wǎng)好像還沒有使用redisson的延遲隊(duì)列的,redisson作為一個(gè)分布式利器,這么好用的工具沒人用有點(diǎn)可惜

前言碎語

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

延遲隊(duì)列多種實(shí)現(xiàn)方式

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

redisson中的延遲隊(duì)列實(shí)現(xiàn)

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

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

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

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

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

3.消費(fèi)已經(jīng)到點(diǎn)的延時(shí)job服務(wù),通過job參數(shù)調(diào)用業(yè)務(wù)執(zhí)行器實(shí)現(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.封裝延時(shí)job服務(wù)

/**
 * Created by kl on 2018/7/20.
 * Content :延時(shí)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作為一個(gè)分布式利器,這么好用的工具沒人用有點(diǎn)可惜,還有一個(gè)原因是有個(gè)想法,想將延遲隊(duì)列這個(gè)功能封裝成一個(gè)spring boot的start依賴,然后開源出來,造福四方,希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解SSH框架和Redis的整合

    詳解SSH框架和Redis的整合

    本篇文章主要介紹了SSH框架和Redis的整合,詳細(xì)的介紹了Struts+Spring+Hibernate和Redis整合,有興趣的可以了解一下。
    2017-03-03
  • Redis三種集群搭建配置(主從集群、哨兵集群、分片集群)

    Redis三種集群搭建配置(主從集群、哨兵集群、分片集群)

    本文主要介紹了Redis三種集群搭建配置,包括主從集群、哨兵集群、分片集群,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • K8s部署Redis主從集群教程

    K8s部署Redis主從集群教程

    本文介紹了在Kubernetes環(huán)境下搭建Redis集群的詳細(xì)步驟,包括環(huán)境準(zhǔn)備、安裝NFS、創(chuàng)建PV卷、搭建Redis集群、集群初始化、主從切換測試以及開放外網(wǎng)端口等內(nèi)容
    2025-01-01
  • Redis實(shí)現(xiàn)布隆過濾器緩存去重的"智能門衛(wèi)"(實(shí)例詳解)

    Redis實(shí)現(xiàn)布隆過濾器緩存去重的"智能門衛(wèi)"(實(shí)例詳解)

    布隆過濾器(Bloom Filter)本質(zhì)是一個(gè)基于哈希函數(shù)的概率型數(shù)據(jù)結(jié)構(gòu),核心作用是快速判斷一個(gè)元素是否存在于集合中,今天給大家介紹Redis實(shí)現(xiàn)布隆過濾器緩存去重的"智能門衛(wèi)",感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Redis+Caffeine兩級(jí)緩存的實(shí)現(xiàn)

    Redis+Caffeine兩級(jí)緩存的實(shí)現(xiàn)

    本文主要介紹了Redis+Caffeine兩級(jí)緩存的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redisson分布式限流的實(shí)現(xiàn)原理分析

    Redisson分布式限流的實(shí)現(xiàn)原理分析

    這篇文章主要介紹了Redisson分布式限流的實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 一篇文章帶你弄清楚Redis的精髓

    一篇文章帶你弄清楚Redis的精髓

    Redis是一個(gè)開源的、支持網(wǎng)絡(luò)、基于內(nèi)存的鍵值對(duì)存儲(chǔ)系統(tǒng),它可以用作數(shù)據(jù)庫、緩存和消息中間件。它支持多種數(shù)據(jù)類型,包括字符串、散列、列表、集合、位圖等,擁有極快的讀寫速度,并且支持豐富的特性,如事務(wù)、持久化、復(fù)制、腳本、發(fā)布/訂閱等。
    2023-02-02
  • Redis cluster集群模式的原理解析

    Redis cluster集群模式的原理解析

    這篇文章主要介紹了Redis cluster集群模式的原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Redis和MySQL保證雙寫一致性的問題解析

    Redis和MySQL保證雙寫一致性的問題解析

    Redis和MySQL的雙寫一致性指的是在同時(shí)使用緩存和數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)的時(shí)候,保證Redis和MySQL中數(shù)據(jù)的一致性,那么如何才能保證他們的一致性呢,下面小編就來為大家詳細(xì)講講
    2023-11-11
  • Redis Cluster集群收縮主從節(jié)點(diǎn)詳細(xì)教程

    Redis Cluster集群收縮主從節(jié)點(diǎn)詳細(xì)教程

    集群收縮的源端就是要下線的主節(jié)點(diǎn),目標(biāo)端就是在線的主節(jié)點(diǎn),這篇文章主要介紹了Redis Cluster集群收縮主從節(jié)點(diǎn)詳細(xì)教程,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

搜索| 财经| 休宁县| 奉贤区| 南丹县| 高邮市| 东海县| 五家渠市| 黔江区| 凤阳县| 竹山县| 伊通| 北流市| 合江县| 平昌县| 通辽市| 泸州市| 南汇区| 玛纳斯县| 东兴市| 保康县| 和龙市| 阳泉市| 那曲县| 辉南县| 紫金县| 开封县| 汉阴县| 永安市| 东阿县| 米泉市| 宁安市| 宁海县| 莱州市| 准格尔旗| 桃江县| 盐源县| 临猗县| 长岭县| 普格县| 河间市|