麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > 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監聽的實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黑人操穴 | 久久96国产精品久久久 | 久久草在线视频 | 97黄色网| 国产午夜精品一区二区三区在线观看 | 国产精品男女 | 国产成人在线一区二区 | 青草视频在线观看视频 | 久草成人在线 | 久草手机在线视频 | 国产日产精品久久久久快鸭 | 午夜视频在线免费观看 | 国产一区二区免费在线观看视频 | 丁香天堂网 | 久久99久久99精品 | 久久精品国产99国产精品亚洲 | 中文字幕观看 | 91网址在线观看 | 色综合欧美 | 福利在线影院 | 久久国产一二三 | 特色一级黄色片 | 亚欧在线免费观看 | 久久综合精品视频 | 久久久久久久久日本理论电影 | 午夜小电影 | www.99re14.com| 色中色在线播放 | 一级视频网站 | 国人精品视频在线观看 | 国产精品麻豆一区二区三区 | 欧美成人黄色片 | 亚洲第一页综合 | 宅男视频在线观看免费 | 亚洲精品一区二区三区在线看 | 国产精品久久久久久久不卡 | 热久久成人 | 国产一区二区三区在线免费观看 | lutube成人福利在线观看 | 久久99精品久久久久久236 | 久草在线视频免费播放 |