婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Redis集群下過期key監聽的實現代碼

Redis集群下過期key監聽的實現代碼

熱門標簽:高碑店市地圖標注app 南京手機外呼系統廠家 臺灣電銷 地圖標注工廠入駐 四川穩定外呼系統軟件 廊坊外呼系統在哪買 b2b外呼系統 一個地圖標注多少錢 400電話辦理的口碑

1. 前言

在使用redis集群時,發現過期key始終監聽不到。網上也沒有現成的解決方案。于是想,既然不能監聽集群,那我可以建立多個redis連接,分別對每個redis的key過期進行監聽。以上做法可能不盡人意,目前也沒找到好的解決方案,如果有好的想法,請留言告知哦!不多說,直接貼我自己的代碼!

2. 代碼實現

關于Redis集群配置代碼此處不貼,直接貼配置監聽類代碼!

redis.host1: 10.113.56.68
redis.port1: 7030
redis.host2: 10.113.56.68
redis.port2: 7031
redis.host3: 10.113.56.68
redis.port3: 7032
redis.host4: 10.113.56.68
redis.port4: 7033
redis.host5: 10.113.56.68
redis.port5: 7034
redis.host6: 10.113.56.68
redis.port6: 7035
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Arrays;

/**
 * @Author xiabing5
 * @Create 2019/8/6 14:46
 * @Desc  監聽redis中Key過期事件
 **/
@Configuration
public class RedisListenerConfig {

  @Value("${redis.host1}")
  private String host1;

  @Value("${redis.host2}")
  private String host2;

  @Value("${redis.host3}")
  private String host3;

  @Value("${redis.host4}")
  private String host4;

  @Value("${redis.host5}")
  private String host5;

  @Value("${redis.host6}")
  private String host6;

  @Value("${redis.port1}")
  private int port1;

  @Value("${redis.port2}")
  private int port2;

  @Value("${redis.port3}")
  private int port3;

  @Value("${redis.port4}")
  private int port4;

  @Value("${redis.port5}")
  private int port5;

  @Value("${redis.port6}")
  private int port6;

  @Bean
  JedisPoolConfig jedisPoolConfig(){
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setMaxIdle(100);
    jedisPoolConfig.setMaxWaitMillis(1000);
    return jedisPoolConfig;
  }

  // redis-cluster不支持key過期監聽,建立多個連接,對每個redis節點進行監聽
  @Bean
  RedisMessageListenerContainer redisContainer1() {
    final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName(host1);
    jedisConnectionFactory.setPort(port1);
    jedisConnectionFactory.setPoolConfig(jedisPoolConfig());
    jedisConnectionFactory.afterPropertiesSet();
    container.setConnectionFactory(jedisConnectionFactory);
    return container;
  }

  @Bean
  RedisMessageListenerContainer redisContainer2() {
    final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName(host2);
    jedisConnectionFactory.setPort(port2);
    jedisConnectionFactory.setPoolConfig(jedisPoolConfig());
    jedisConnectionFactory.afterPropertiesSet();
    container.setConnectionFactory(jedisConnectionFactory);
    return container;
  }

  @Bean
  RedisMessageListenerContainer redisContainer3() {
    final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName(host3);
    jedisConnectionFactory.setPort(port3);
    jedisConnectionFactory.setPoolConfig(jedisPoolConfig());
    jedisConnectionFactory.afterPropertiesSet();
    container.setConnectionFactory(jedisConnectionFactory);
    return container;
  }

  @Bean
  RedisMessageListenerContainer redisContainer4() {
    final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName(host4);
    jedisConnectionFactory.setPort(port4);
    jedisConnectionFactory.setPoolConfig(jedisPoolConfig());
    jedisConnectionFactory.afterPropertiesSet();
    container.setConnectionFactory(jedisConnectionFactory);
    return container;
  }

  @Bean
  RedisMessageListenerContainer redisContainer5() {
    final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName(host5);
    jedisConnectionFactory.setPort(port5);
    jedisConnectionFactory.setPoolConfig(jedisPoolConfig());
    jedisConnectionFactory.afterPropertiesSet();
    container.setConnectionFactory(jedisConnectionFactory);
    return container;
  }

  @Bean
  RedisMessageListenerContainer redisContainer6() {
    final RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
    jedisConnectionFactory.setHostName(host6);
    jedisConnectionFactory.setPort(port6);
    jedisConnectionFactory.setPoolConfig(jedisPoolConfig());
    jedisConnectionFactory.afterPropertiesSet();
    container.setConnectionFactory(jedisConnectionFactory);
    return container;
  }

  @Bean
  RedisKeyExpirationListener redisKeyExpirationListener1() {
    return new RedisKeyExpirationListener(redisContainer1());
  }

  @Bean
  RedisKeyExpirationListener redisKeyExpirationListener2() {
    return new RedisKeyExpirationListener(redisContainer2());
  }

  @Bean
  RedisKeyExpirationListener redisKeyExpirationListener3() {
    return new RedisKeyExpirationListener(redisContainer3());
  }

  @Bean
  RedisKeyExpirationListener redisKeyExpirationListener4() {
    return new RedisKeyExpirationListener(redisContainer4());
  }

  @Bean
  RedisKeyExpirationListener redisKeyExpirationListener5() {
    return new RedisKeyExpirationListener(redisContainer5());
  }

  @Bean
  RedisKeyExpirationListener redisKeyExpirationListener6() {
    return new RedisKeyExpirationListener(redisContainer6());
  }

}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import java.util.Date;

/**
 * @Author xiabing5
 * @Create 2019/9/4 9:47
 * @Desc  redis過期監聽
 **/
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
  @Autowired
  RedisUtil redisUtil;
  @Autowired
  LoginUserStatisticsMapper loginUserStatisticsMapper;
  public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
    super(listenerContainer);
  }
  @Override
  public void onMessage(Message message, byte[] pattern) {
    // 用戶做自己的業務處理即可,message.toString()可以獲取失效的key
    String mesg = message.toString();   
  }
}

3. Redis防止過期key重復監聽

對于項目集群情況下,部署多個服務后,容易出現redis過期被多個服務同時監聽到,從而執行相同的業務邏輯,這不是我們期望的。單機部署下方法的同步可以采用synchronize關鍵字。但集群下,就得采用分布式鎖。在需要加鎖的地方,只要加鎖和解鎖即可。此處正好寫到Redis,那就貼一個自己用的redis分布式鎖。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import java.util.Collections;
import java.util.UUID;
/**
 * @Author xiabing5
 * @Create 2019/9/6 15:54
 * @Desc  redis分布式鎖
 **/
@Component
public class RedisLock {
  @Autowired
  Jedis jedis;
  private static final String SET_IF_NOT_EXIST = "NX"; // NX表示如果不存在key就設置value
  private static final String SET_WITH_EXPIRE_TIME = "PX"; // PX表示毫秒
  // 加鎖
  public String tryLock(String key,Long acquireTimeout) {
    // 生成隨機value
    String identifierValue = UUID.randomUUID().toString();
    // 設置超時時間
    Long endTime = System.currentTimeMillis() + acquireTimeout;
    // 循環獲取鎖
    while (System.currentTimeMillis()  endTime) {
      String result = jedis.set(key,identifierValue, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, acquireTimeout);
      if("OK".equals(result)) {
        return identifierValue;
      }
    }
    return null;
  }
  // 解鎖
//  public void delLock(String key,String identifierValue) {
//    // 判斷是否是同一把鎖
//    try{
//      if(jedis.get(key).equals(identifierValue)){
//        // 此處操作非原子性,容易造成釋放非自己的鎖
//        jedis.del(key);
//      }
//    }catch(Exception e) {
//      e.printStackTrace();
//    }
//  }
  // 使用Lua代碼解鎖
  public void delLock(String key,String identifierValue) {
    try{
      String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
      Long result = (Long) jedis.eval(script, Collections.singletonList(key), Collections.singletonList(identifierValue));
      if (1 == result) {
        System.out.println(result+"釋放鎖成功");
      } if (0 == result) {
        System.out.println(result+"釋放鎖失敗");
      }
    }catch (Exception e) {
      e.printStackTrace();
    }
  }
}

4. 總結

自己實現的一個小demo,廢話比較少。小白自己寫的配置類,理解有問題請留言!自己實現的方案感覺不妥,只是基本完成需求,還得繼續研究。

以上所述是小編給大家介紹的Redis集群下過期key監聽的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

您可能感興趣的文章:
  • 基于docker搭建redis集群的方法
  • Docker 部署單機版 Pulsar 和集群架構 Redis(開發神器)的方法
  • Redis Cluster集群數據分片機制原理
  • springcloud微服務基于redis集群的單點登錄實現解析
  • springboot整合redis集群過程解析
  • Java調用Redis集群代碼及問題解決
  • Linux(Centos7)下redis5集群搭建和使用說明詳解
  • 基于docker搭建redis-sentinel集群的方法示例
  • 詳細分析Redis集群故障
  • 比較幾種Redis集群方案

標簽:拉薩 南寧 定州 河源 甘南 畢節 伊春 泰州

巨人網絡通訊聲明:本文標題《Redis集群下過期key監聽的實現代碼》,本文關鍵詞  Redis,集群,下,過期,key,監聽,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis集群下過期key監聽的實現代碼》相關的同類信息!
  • 本頁收集關于Redis集群下過期key監聽的實現代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩精品免费视频人成| 国产xxx精品视频大全| 91国偷自产一区二区开放时间 | 欧美国产精品v| 欧美一区二区三区在线观看 | 韩日精品视频一区| 国产麻豆成人传媒免费观看| 国产精品综合在线视频| 欧美tickle裸体挠脚心vk| 欧美mv日韩mv国产| 国产女主播视频一区二区| 国产情人综合久久777777| 亚洲欧洲日韩一区二区三区| 国产精品久久久久久久久动漫| 亚洲欧美二区三区| 日本不卡一二三| 成人午夜激情视频| 在线播放欧美女士性生活| 国产女主播视频一区二区| 亚洲va国产va欧美va观看| 免费观看一级欧美片| 91浏览器在线视频| 国产网站一区二区三区| 亚洲精品免费在线| 成人av午夜影院| 亚洲激情校园春色| 免费欧美高清视频| 在线视频国内自拍亚洲视频| 精品美女被调教视频大全网站| 亚洲影院免费观看| 在线看不卡av| 亚洲欧美日韩综合aⅴ视频| 国产麻豆午夜三级精品| 欧美精品在线观看一区二区| 欧美国产一区在线| 国精产品一区一区三区mba视频 | 国产精品国产三级国产aⅴ原创| 日韩中文字幕不卡| 欧美精品国产精品| 五月婷婷综合激情| 日韩一区二区三区在线| 亚洲第一狼人社区| 欧美久久久久久久久中文字幕| 亚洲自拍偷拍九九九| 欧美老肥妇做.爰bbww| 奇米影视一区二区三区小说| 欧美日本一道本| 蜜桃视频一区二区三区在线观看| 777a∨成人精品桃花网| 精品一区二区三区影院在线午夜| 久久久久久久综合日本| 91社区在线播放| 久久99热这里只有精品| 中文字幕高清不卡| 在线观看日韩一区| 久久97超碰色| 国产精品理伦片| 日韩一区二区三区免费看| www.久久久久久久久| 日本中文字幕一区二区有限公司| 国产精品国产精品国产专区不片 | 欧美日韩精品欧美日韩精品一| 成人丝袜高跟foot| 久久国产麻豆精品| 亚洲午夜精品一区二区三区他趣| 久久嫩草精品久久久精品| 欧美四级电影网| 不卡一卡二卡三乱码免费网站| 午夜精品aaa| 亚洲国产美国国产综合一区二区| 国产网红主播福利一区二区| 欧美一区午夜视频在线观看 | 成人av在线电影| 国产精品一卡二| 日本成人中文字幕| 日韩av一级片| 美女视频网站黄色亚洲| 亚洲一区二区三区免费视频| 亚洲精品乱码久久久久久久久| 国产精品美女www爽爽爽| 欧美日韩激情在线| 国产99久久久久久免费看农村| 久草精品在线观看| 一区二区三区国产豹纹内裤在线| 91免费视频大全| 中文一区二区在线观看| 播五月开心婷婷综合| 精品国产乱码久久久久久图片| 日韩成人av影视| 日韩午夜在线观看| 日本不卡的三区四区五区| 毛片av一区二区| 久久伊人蜜桃av一区二区| 亚洲午夜免费视频| 国产亚洲1区2区3区| 一本色道久久加勒比精品| 99久久综合国产精品| 日韩激情中文字幕| 国产aⅴ综合色| 一区二区三区在线观看欧美| 在线播放日韩导航| 成人免费毛片a| 午夜精品爽啪视频| 久久精品在线免费观看| 夜夜揉揉日日人人青青一国产精品 | 国产综合久久久久久鬼色| 精品国产露脸精彩对白| 国产精品一色哟哟哟| 99精品视频一区二区三区| 免费人成网站在线观看欧美高清| 日本中文字幕一区二区视频| 亚洲电影一区二区三区| 欧美精品一区二区三区视频| 美女视频第一区二区三区免费观看网站| 精品国产凹凸成av人导航| 欧美精品 国产精品| 欧美影院一区二区| k8久久久一区二区三区| 中文字幕一区二区三区在线播放 | 日本一区二区三区久久久久久久久不 | 日韩欧美激情四射| 久久99这里只有精品| 蜜臀av国产精品久久久久| 秋霞午夜av一区二区三区| 美国毛片一区二区三区| 在线成人免费观看| 国产精品每日更新| 国产毛片精品一区| 91精品国产综合久久精品app| 精品国产人成亚洲区| 亚洲成人一区二区在线观看| 成人精品鲁一区一区二区| 亚洲男人天堂av网| 在线观看亚洲a| 国产精品―色哟哟| 伊人夜夜躁av伊人久久| 五月天视频一区| 欧美精品一卡二卡| 国产欧美日韩精品一区| 欧美日韩久久一区二区| 久久99精品久久久久久| 色播五月激情综合网| 欧美国产日韩在线观看| 精品写真视频在线观看| 日韩精品一区二区三区三区免费| 国产精品美女久久久久aⅴ国产馆| 在线电影院国产精品| 波多野结衣一区二区三区| 国产传媒欧美日韩成人| 国产精品国产三级国产普通话三级 | 不卡一区在线观看| 国产午夜亚洲精品午夜鲁丝片| 麻豆一区二区三| 欧美一级片在线| 麻豆免费精品视频| 欧美精品 国产精品| 蜜桃视频一区二区| 依依成人综合视频| 久久日一线二线三线suv| 91蝌蚪porny九色| 国产成人免费视频一区| 性久久久久久久久久久久| 久久亚洲精品国产精品紫薇| 欧美欧美欧美欧美| 666欧美在线视频| 51久久夜色精品国产麻豆| 日本麻豆一区二区三区视频| 丰满白嫩尤物一区二区| 91天堂素人约啪| 26uuu亚洲综合色| 亚洲欧美日韩在线不卡| 日本欧美韩国一区三区| 高清不卡在线观看av| 一本在线高清不卡dvd| 精品少妇一区二区三区日产乱码| 免费国产亚洲视频| 亚洲午夜精品久久久久久久久| 国产精品成人一区二区艾草 | 国产三级精品在线| 国产精品美女一区二区三区| 日本一区二区三区免费乱视频 | 日韩免费电影网站| 欧美激情在线一区二区| 亚洲欧美日韩一区| 蜜臀av一区二区在线免费观看| 国产成人综合在线播放| 色系网站成人免费| 精品少妇一区二区三区视频免付费| 精品国产123| 无码av中文一区二区三区桃花岛| 国产精品一级片在线观看| 色美美综合视频| 国产欧美一区二区在线观看| 亚洲狠狠爱一区二区三区| 不卡欧美aaaaa| 久久人人爽人人爽| 美腿丝袜亚洲色图| 8x8x8国产精品| 香蕉av福利精品导航| 99久久久免费精品国产一区二区|