亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識(shí)庫 > Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼

Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼

熱門標(biāo)簽:高碑店市地圖標(biāo)注app 南京手機(jī)外呼系統(tǒng)廠家 臺(tái)灣電銷 地圖標(biāo)注工廠入駐 四川穩(wěn)定外呼系統(tǒng)軟件 廊坊外呼系統(tǒng)在哪買 b2b外呼系統(tǒng) 一個(gè)地圖標(biāo)注多少錢 400電話辦理的口碑

1. 前言

在使用redis集群時(shí),發(fā)現(xiàn)過期key始終監(jiān)聽不到。網(wǎng)上也沒有現(xiàn)成的解決方案。于是想,既然不能監(jiān)聽集群,那我可以建立多個(gè)redis連接,分別對(duì)每個(gè)redis的key過期進(jìn)行監(jiān)聽。以上做法可能不盡人意,目前也沒找到好的解決方案,如果有好的想法,請(qǐng)留言告知哦!不多說,直接貼我自己的代碼!

2. 代碼實(shí)現(xiàn)

關(guān)于Redis集群配置代碼此處不貼,直接貼配置監(jiān)聽類代碼!

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  監(jiān)聽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過期監(jiān)聽,建立多個(gè)連接,對(duì)每個(gè)redis節(jié)點(diǎn)進(jìn)行監(jiān)聽
  @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過期監(jiān)聽
 **/
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) {
    // 用戶做自己的業(yè)務(wù)處理即可,message.toString()可以獲取失效的key
    String mesg = message.toString();   
  }
}

3. Redis防止過期key重復(fù)監(jiān)聽

對(duì)于項(xiàng)目集群情況下,部署多個(gè)服務(wù)后,容易出現(xiàn)redis過期被多個(gè)服務(wù)同時(shí)監(jiān)聽到,從而執(zhí)行相同的業(yè)務(wù)邏輯,這不是我們期望的。單機(jī)部署下方法的同步可以采用synchronize關(guān)鍵字。但集群下,就得采用分布式鎖。在需要加鎖的地方,只要加鎖和解鎖即可。此處正好寫到Redis,那就貼一個(gè)自己用的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就設(shè)置value
  private static final String SET_WITH_EXPIRE_TIME = "PX"; // PX表示毫秒
  // 加鎖
  public String tryLock(String key,Long acquireTimeout) {
    // 生成隨機(jī)value
    String identifierValue = UUID.randomUUID().toString();
    // 設(shè)置超時(shí)時(shí)間
    Long endTime = System.currentTimeMillis() + acquireTimeout;
    // 循環(huán)獲取鎖
    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. 總結(jié)

自己實(shí)現(xiàn)的一個(gè)小demo,廢話比較少。小白自己寫的配置類,理解有問題請(qǐng)留言!自己實(shí)現(xiàn)的方案感覺不妥,只是基本完成需求,還得繼續(xù)研究。

以上所述是小編給大家介紹的Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

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

標(biāo)簽:拉薩 南寧 定州 河源 甘南 畢節(jié) 伊春 泰州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼》,本文關(guān)鍵詞  Redis,集群,下,過期,key,監(jiān)聽,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于Redis集群下過期key監(jiān)聽的實(shí)現(xiàn)代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    四虎影视久久久| 天天做日日干| 欧美大片a一级毛片视频| 国产亚洲精品aaa大片| 91麻豆精品国产片在线观看| 精品国产一区二区三区久久久狼| 成人a级高清视频在线观看| 精品久久久久久免费影院| 天天做人人爱夜夜爽2020| 国产一区二区高清视频| 国产一区二区高清视频| 国产综合91天堂亚洲国产| 欧美另类videosbestsex| 久久精品欧美一区二区| 国产视频一区二区在线观看| 日韩在线观看免费完整版视频| 91麻豆国产福利精品| 久久精品店| 毛片电影网| 成人在激情在线视频| 国产一区二区精品久| 黄视频网站免费| 日本特黄特色aa大片免费| 成人免费一级毛片在线播放视频| 免费国产在线观看| 一级毛片看真人在线视频| 国产91素人搭讪系列天堂| 黄色免费网站在线| 久久国产一久久高清| 久久国产精品自由自在| 日韩在线观看视频网站| 精品国产亚洲人成在线| 成人免费观看网欧美片| 日本乱中文字幕系列| 国产视频在线免费观看| 国产成+人+综合+亚洲不卡| 四虎影视久久| 久久国产精品只做精品| 久久久久久久网| 国产伦理精品| 色综合久久手机在线| 亚洲天堂一区二区三区四区| 国产亚洲精品成人a在线| 欧美一级视频免费观看| 日韩一级黄色| 九九热精品免费观看| 成人高清护士在线播放| 91麻豆精品国产自产在线观看一区| 亚洲天堂在线播放| 日本特黄特色aaa大片免费| 久久成人亚洲| 欧美爱爱动态| 99久久精品国产麻豆| 久久精品欧美一区二区| 久久国产精品永久免费网站| 韩国毛片免费大片| 亚洲爆爽| 美女免费精品视频在线观看| 午夜欧美成人久久久久久| 四虎影视库国产精品一区| 国产伦精品一区二区三区在线观看| 亚洲第一页乱| 99久久精品国产国产毛片| 国产视频网站在线观看| 欧美国产日韩在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩一级黄色片| 精品国产亚一区二区三区| 91麻豆精品国产自产在线| 亚洲天堂免费观看| 久草免费在线色站| 成人高清免费| 精品美女| 你懂的日韩| 韩国三级香港三级日本三级| 中文字幕97| 高清一级片| 欧美大片一区| 国产a网| 日本在线www| 国产一级生活片| 国产国产人免费视频成69堂| 日韩男人天堂| 97视频免费在线| 久久精品免视看国产明星| 国产极品精频在线观看| 欧美日本二区| 国产一区二区精品久久| 精品视频在线观看一区二区| 国产伦精品一区二区三区在线观看| 久久国产精品永久免费网站| 沈樵在线观看福利| 国产一区免费观看| 久久国产影院| 色综合久久手机在线| 麻豆午夜视频| 国产精品自拍在线观看| 亚久久伊人精品青青草原2020| 欧美激情一区二区三区中文字幕| 日韩在线观看免费完整版视频| 日韩专区第一页| 免费国产在线视频| 国产亚洲精品成人a在线| 成人免费观看视频| 韩国三级香港三级日本三级la| 国产福利免费视频| 91麻豆国产级在线| 99热精品一区| 日本在线www| 日日日夜夜操| 一级毛片视频在线观看| 麻豆午夜视频| 香蕉视频三级| 亚洲女人国产香蕉久久精品| 精品国产一区二区三区久| 欧美激情一区二区三区中文字幕| 91麻豆精品国产自产在线观看一区| 九九精品在线| 国产激情视频在线观看| 欧美日本二区| 久久精品人人做人人爽97| 成人a大片在线观看| 青草国产在线| 欧美激情伊人| 精品久久久久久影院免费| 日韩av片免费播放| 精品久久久久久综合网 | 精品国产一区二区三区精东影业| 天天做人人爱夜夜爽2020| 美国一区二区三区| 国产视频一区二区在线观看| 成人高清视频在线观看| 亚洲精品永久一区| 韩国三级香港三级日本三级la| 黄视频网站免费| 国产91丝袜在线播放0| 亚洲 欧美 91| 日本乱中文字幕系列| 欧美一级视| 精品久久久久久影院免费| 毛片电影网| 日韩一级黄色片| 国产精品自拍在线| 一a一级片| 成人免费一级纶理片| 久草免费在线观看| 国产欧美精品| 99久久精品国产片| 精品国产一区二区三区久| 欧美一区二区三区在线观看| 国产精品自拍亚洲| 成人高清免费| 国产精品1024永久免费视频 | 超级乱淫伦动漫| 高清一级片| 日韩专区第一页| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久精品免视看国产成人2021| 黄视频网站在线免费观看| 一级毛片看真人在线视频| 日韩在线观看免费| 欧美1卡一卡二卡三新区| 国产精品123| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲精品影院| 国产一区二区精品在线观看| 国产91精品系列在线观看| 精品国产香蕉在线播出| 成人免费观看视频| 四虎影视久久| 久久国产精品永久免费网站| 国产美女在线观看| 免费一级生活片| 国产不卡高清在线观看视频| a级毛片免费全部播放| 999久久久免费精品国产牛牛| 国产高清在线精品一区二区| 麻豆午夜视频| 欧美国产日韩在线| 中文字幕一区二区三区 精品| 色综合久久久久综合体桃花网| 一级女性全黄生活片免费| 精品视频免费观看| 你懂的日韩| 日韩字幕在线| 欧美日本二区| 国产伦久视频免费观看 视频| 日韩免费在线观看视频| 99久久精品国产麻豆| 九九热精品免费观看| 天天做日日干| 午夜家庭影院| 精品在线视频播放| 国产激情一区二区三区| 精品视频一区二区三区免费| 国产91素人搭讪系列天堂| 日日日夜夜操| 91麻豆爱豆果冻天美星空| 99久久精品国产麻豆|