亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

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

2020-10-28 21:29:12
字體:
來源:轉載
供稿:網友

1. 前言

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

2. 代碼實現

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

redis.host1: 10.113.56.68redis.port1: 7030redis.host2: 10.113.56.68redis.port2: 7031redis.host3: 10.113.56.68redis.port3: 7032redis.host4: 10.113.56.68redis.port4: 7033redis.host5: 10.113.56.68redis.port5: 7034redis.host6: 10.113.56.68redis.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過期事件 **/@Configurationpublic 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分布式鎖 **/@Componentpublic 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監聽的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
孩xxxx性bbbb欧美| 欧美综合国产精品久久丁香| 国内精品久久久久久久| 久久免费视频在线观看| 久久青草精品视频免费观看| 亚洲激情视频网站| 成人免费淫片视频软件| 日本精品久久久久影院| 亚洲jizzjizz日本少妇| 亚洲国产精品视频在线观看| 国产伦精品一区二区三区精品视频| 国产999精品| 中文字幕欧美日韩va免费视频| 欧美精品videosex性欧美| 欧美成人性生活| 成人黄色午夜影院| 中文字幕av一区中文字幕天堂| 福利微拍一区二区| 91久久国产综合久久91精品网站| 国产欧美日韩精品在线观看| 久久久久久久久久亚洲| 久久久亚洲欧洲日产国码aⅴ| 欧美性生交大片免网| 国产成人激情小视频| 亚洲国产精品久久久久| 欧美极品少妇xxxxx| 这里只有精品在线观看| 亚洲影影院av| 欧美色视频日本高清在线观看| 粉嫩av一区二区三区免费野| 中文字幕日韩在线播放| 久久久久久噜噜噜久久久精品| 久久精品国产欧美亚洲人人爽| 欧美一区二三区| 欧美电影免费观看电视剧大全| 91久久久国产精品| 成人午夜黄色影院| 欧美一级电影免费在线观看| 日韩人体视频一二区| 欧美另类极品videosbest最新版本| 一区二区欧美激情| 国产日韩欧美一二三区| 久久九九精品99国产精品| 久久伊人精品天天| 欧美精品videos另类日本| 日本韩国在线不卡| 91精品久久久久久久久青青| 2024亚洲男人天堂| 4p变态网欧美系列| 亚洲国产女人aaa毛片在线| 亚洲精品乱码久久久久久按摩观| 成人做爰www免费看视频网站| 亚洲级视频在线观看免费1级| 日韩欧美亚洲综合| 美女福利视频一区| 日韩中文字幕精品| 国产精品久在线观看| 69久久夜色精品国产69乱青草| 欧美成人亚洲成人日韩成人| 精品呦交小u女在线| 国产精品一区二区三区毛片淫片| 国产婷婷色综合av蜜臀av| xxxx性欧美| 成人a视频在线观看| 欧美日本高清一区| 国产中文欧美精品| 亚洲欧美日韩爽爽影院| 日韩精品在线电影| 国产在线观看一区二区三区| 在线播放日韩欧美| 欧美激情一级欧美精品| 国产精品色午夜在线观看| 亚洲色在线视频| 亚洲香蕉在线观看| 精品呦交小u女在线| 国产噜噜噜噜久久久久久久久| 欧美激情亚洲综合一区| 久久99精品久久久久久琪琪| 亚洲国产婷婷香蕉久久久久久| 中文字幕亚洲在线| 日韩精品视频在线| 日韩在线中文字| 在线看日韩av| 中国china体内裑精亚洲片| 26uuu久久噜噜噜噜| 亚洲国产一区二区三区在线观看| 欧美精品少妇videofree| 在线看欧美日韩| 91精品美女在线| 神马久久桃色视频| 日本欧美一级片| 北条麻妃久久精品| 久久国产加勒比精品无码| 亚洲桃花岛网站| 亚洲第一精品福利| 欧美激情2020午夜免费观看| 久久久久久九九九| 九九热精品视频| 91成人在线播放| 国产精品爽黄69| 亚洲欧美制服第一页| 国产福利视频一区二区| 亚洲美女www午夜| 国产精品网址在线| 51久久精品夜色国产麻豆| 色妞一区二区三区| 色偷偷偷亚洲综合网另类| 欧洲亚洲免费视频| 欧美激情视频免费观看| 亚洲欧洲美洲在线综合| 97久久超碰福利国产精品…| 国产一区红桃视频| 欧美国产日韩中文字幕在线| 91在线精品视频| 亚洲人成绝费网站色www| 狠狠躁夜夜躁久久躁别揉| 国产一区二区三区直播精品电影| 欧美电影在线免费观看网站| 精品香蕉一区二区三区| 97在线观看视频国产| 久久精品国产亚洲精品2020| 国产精品视频xxx| 中文字幕亚洲激情| 国产成人精品亚洲精品| 青青久久av北条麻妃海外网| 欧美日韩免费区域视频在线观看| 亚洲一品av免费观看| 欧美激情亚洲自拍| 国产91色在线|| 日韩亚洲精品视频| 欧美日韩成人免费| 久久久中精品2020中文| 久久天天躁狠狠躁夜夜躁2014| 色哟哟网站入口亚洲精品| 亚洲国产日韩精品在线| 国内精品视频一区| 日韩免费在线播放| 欧美激情视频一区| 亚洲欧美在线免费| 欧美激情视频一区二区| 日韩av一区在线观看| 国产成人在线精品| 国内免费久久久久久久久久久| 啊v视频在线一区二区三区| 韩国日本不卡在线| 亚洲2020天天堂在线观看| 亚洲国产精品99久久| 国产精品福利网| 国产视频亚洲视频| 日韩在线免费av| 亚洲成av人影院在线观看| 92看片淫黄大片看国产片| 日韩中文字幕在线| 91最新在线免费观看| 国产精品视频久| 久热精品视频在线观看一区| www国产精品视频| 亚洲成人中文字幕| 精品欧美一区二区三区| 日韩av免费观影| 日韩免费看的电影电视剧大全| 国产精品免费网站| 国产精品v日韩精品| 亚洲在线免费看|