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

redis實(shí)現(xiàn)延時(shí)隊(duì)列的兩種方式(小結(jié))

 更新時(shí)間:2021年04月02日 10:31:54   作者:卿著飛翔  
這篇文章主要介紹了redis實(shí)現(xiàn)延時(shí)隊(duì)列的兩種方式(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

項(xiàng)目中的流程監(jiān)控,有幾種節(jié)點(diǎn),需要監(jiān)控每一個(gè)節(jié)點(diǎn)是否超時(shí)。按傳統(tǒng)的做法,肯定是通過(guò)定時(shí)任務(wù),去掃描然后判斷,但是定時(shí)任務(wù)有缺點(diǎn):1,數(shù)據(jù)量大會(huì)慢;2,時(shí)間不好控制,太短,怕一次處理不完,太長(zhǎng)狀態(tài)就會(huì)有延遲。所以就想到用延遲隊(duì)列的方式去實(shí)現(xiàn)。

一,redis的過(guò)期key監(jiān)控

1,開(kāi)啟過(guò)期key監(jiān)聽(tīng)

在redis的配置里把這個(gè)注釋去掉

notify-keyspace-events Ex

然后重啟redis

2,使用redis過(guò)期監(jiān)聽(tīng)實(shí)現(xiàn)延遲隊(duì)列

繼承KeyExpirationEventMessageListener類,實(shí)現(xiàn)父類的方法,就可以監(jiān)聽(tīng)key過(guò)期時(shí)間了。當(dāng)有key過(guò)期,就會(huì)執(zhí)行這里。這里就把需要的key過(guò)濾出來(lái),然后發(fā)送給kafka隊(duì)列。

@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

  @Autowired
  private KafkaProducerService kafkaProducerService;

  public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
    super(listenerContainer);
  }

  /**
   * 針對(duì) redis 數(shù)據(jù)失效事件,進(jìn)行數(shù)據(jù)處理
   * @param message
   * @param pattern
   */
  @Override
  public void onMessage(Message message, byte[] pattern){
    if(message == null || StringUtils.isEmpty(message.toString())){
      return;
    }
    String content = message.toString();
    //key的格式為  flag:時(shí)效類型:運(yùn)單號(hào) 示例如下
    try {
      if(content.startsWith(AbnConstant.EMS)){
        kafkaProducerService.sendMessageSync(TopicConstant.EMS_WAYBILL_ABN_QUEUE,content);
      }else if(content.startsWith(AbnConstant.YUNDA)){
        kafkaProducerService.sendMessageSync(TopicConstant.YUNDA_WAYBILL_ABN_QUEUE,content);
      }
    } catch (Exception e) {
      log.error("監(jiān)控過(guò)期key,發(fā)送kafka異常,",e);
    }
  }
}

可以看的出來(lái),這種方式其實(shí)是很簡(jiǎn)單的,但是有幾個(gè)問(wèn)題需要注意,一是,這個(gè)盡量單機(jī)運(yùn)行,因?yàn)槎嗯_(tái)機(jī)器都會(huì)執(zhí)行,浪費(fèi)cpu,增加數(shù)據(jù)庫(kù)負(fù)擔(dān)。二是,機(jī)器頻繁部署的時(shí)候,如果有時(shí)間間隔,會(huì)出現(xiàn)數(shù)據(jù)的漏處理。

二,redis的zset實(shí)現(xiàn)延遲隊(duì)列

1,生產(chǎn)者實(shí)現(xiàn)

可以看到生產(chǎn)者很簡(jiǎn)單,其實(shí)就是利用zset的特性,給一個(gè)zset添加元素而已,而時(shí)間就是它的score。

public void produce(Integer taskId, long exeTime) {
  System.out.println("加入任務(wù), taskId: " + taskId + ", exeTime: " + exeTime + ", 當(dāng)前時(shí)間:" + LocalDateTime.now());
  RedisOps.getJedis().zadd(RedisOps.key, exeTime, String.valueOf(taskId));
}

2,消費(fèi)者實(shí)現(xiàn)

消費(fèi)者的代碼也不難,就是把已經(jīng)過(guò)期的zset中的元素給刪除掉,然后處理數(shù)據(jù)。

public void consumer() {
  Executors.newSingleThreadExecutor().submit(new Runnable() {
    @Override
    public void run() {
      while (true) {
        Set<String> taskIdSet = RedisOps.getJedis().zrangeByScore(RedisOps.key, 0, System.currentTimeMillis(), 0, 1);
        if (taskIdSet == null || taskIdSet.isEmpty()) {
          System.out.println("沒(méi)有任務(wù)");
 
        } else {
          taskIdSet.forEach(id -> {
            long result = RedisOps.getJedis().zrem(RedisOps.key, id);
            if (result == 1L) {
              System.out.println("從延時(shí)隊(duì)列中獲取到任務(wù),taskId:" + id + " , 當(dāng)前時(shí)間:" + LocalDateTime.now());
            }
          });
        }
        try {
          TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  });
}

可以看到這種方式其實(shí)是比上個(gè)方式要好的。因?yàn)?,他的那兩個(gè)缺點(diǎn)都被克服掉了。多臺(tái)機(jī)器也沒(méi)事兒,也不用再擔(dān)心部署時(shí)間間隔長(zhǎng)的問(wèn)題。

總結(jié)

兩個(gè)方式都是不錯(cuò)的,都能解決問(wèn)題。碰到問(wèn)題,多思考,多總結(jié)。

到此這篇關(guān)于redis實(shí)現(xiàn)延時(shí)隊(duì)列的兩種方式(小結(jié))的文章就介紹到這了,更多相關(guān)redis 延時(shí)隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 手把手教你用Redis 實(shí)現(xiàn)點(diǎn)贊功能并且與數(shù)據(jù)庫(kù)同步

    手把手教你用Redis 實(shí)現(xiàn)點(diǎn)贊功能并且與數(shù)據(jù)庫(kù)同步

    本文主要介紹了Redis 實(shí)現(xiàn)點(diǎn)贊功能并且與數(shù)據(jù)庫(kù)同步,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • redis字符串類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis字符串類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis字符串類型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 一文詳解Redis的主從同步原理

    一文詳解Redis的主從同步原理

    Redis為了保證服務(wù)高可用,其中一種實(shí)現(xiàn)就是主從模式,本篇文章將對(duì)主從模式中為了保證主節(jié)點(diǎn)和從節(jié)點(diǎn)數(shù)據(jù)一致而實(shí)現(xiàn)的主從同步機(jī)制進(jìn)行學(xué)習(xí),感興趣的同學(xué)可以參考閱讀下
    2023-07-07
  • Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶端詳解

    Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶端詳解

    Redis作為當(dāng)前最流行的內(nèi)存數(shù)據(jù)庫(kù)之一,以其高性能、豐富的數(shù)據(jù)結(jié)構(gòu)和靈活的持久化機(jī)制,廣泛應(yīng)用于緩存、消息隊(duì)列、分布式鎖等場(chǎng)景,這篇文章主要介紹了Redis初識(shí)、Redis的安裝與啟動(dòng)、Redis命令及Java客戶端的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • Redis網(wǎng)絡(luò)I/O模型的使用及說(shuō)明

    Redis網(wǎng)絡(luò)I/O模型的使用及說(shuō)明

    文章詳細(xì)介紹了Redis的網(wǎng)絡(luò)模型,包括單線程和多線程模型,以及I/O多路復(fù)用、事件通知機(jī)制、信號(hào)驅(qū)動(dòng)I/O和異步I/O等技術(shù),同時(shí)簡(jiǎn)要介紹了Redis的通信協(xié)議RESP
    2025-12-12
  • Redis實(shí)現(xiàn)短信登錄的示例代碼

    Redis實(shí)現(xiàn)短信登錄的示例代碼

    本文主要介紹了Redis實(shí)現(xiàn)短信登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis 配置與優(yōu)化完全指南

    Redis 配置與優(yōu)化完全指南

    本文系統(tǒng)講解Redis作為高性能內(nèi)存數(shù)據(jù)庫(kù)的核心特性,涵蓋與關(guān)系型數(shù)據(jù)庫(kù)對(duì)比、安裝部署、常用命令、持久化機(jī)制(RDB/AOF)、高可用方案及性能優(yōu)化,重點(diǎn)分析緩存穿透、擊穿、雪崩問(wèn)題的解決方案,助力掌握Redis在高并發(fā)場(chǎng)景下的應(yīng)用與管理,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Redis位圖bitmap操作

    Redis位圖bitmap操作

    本文主要介紹了Redis位圖bitmap操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • NoSQL和Redis簡(jiǎn)介及Redis在Windows下的安裝和使用教程

    NoSQL和Redis簡(jiǎn)介及Redis在Windows下的安裝和使用教程

    這篇文章主要介紹了NoSQL和Redis簡(jiǎn)介及Redis在Windows下的安裝和使用教程,本文同時(shí)講解了python操作redis,并給出了操作實(shí)例,需要的朋友可以參考下
    2015-01-01
  • Redis消息隊(duì)列、阻塞隊(duì)列、延時(shí)隊(duì)列的實(shí)現(xiàn)

    Redis消息隊(duì)列、阻塞隊(duì)列、延時(shí)隊(duì)列的實(shí)現(xiàn)

    Redis是一種常用的內(nèi)存數(shù)據(jù)庫(kù),它提供了豐富的功能,通常用于數(shù)據(jù)緩存和分布式隊(duì)列,本文主要介紹了Redis消息隊(duì)列、阻塞隊(duì)列、延時(shí)隊(duì)列的實(shí)現(xiàn),感興趣的可以了解一下
    2023-11-11

最新評(píng)論

蒙自县| 玉田县| 高淳县| 江安县| 慈溪市| 临潭县| 中西区| 卫辉市| 宜兰县| 杨浦区| 威远县| 汤原县| 永平县| 犍为县| 交城县| 漳平市| 通州市| 洛阳市| 乌拉特后旗| 贡山| 达州市| 平塘县| 河北省| 连江县| 高邮市| 伊金霍洛旗| 新蔡县| 宁蒗| 镇平县| 启东市| 邹平县| 肃宁县| 青阳县| 塘沽区| 剑阁县| 平邑县| 乐安县| 武川县| 内江市| 贵州省| 原平市|