天天看點

springboot連接配接redis哨兵模式

  1. jar包
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
               
  2. 配置檔案yml
    redis:
          maxIdle: 300                         #最大空閑數
          maxTotal:  1000                        #連接配接池的最大資料庫連接配接數。設為0表示無限制,如果是jedis 2.4以後用redis.maxTotal
          maxWaitMillis : 1000                      # 最大建立連接配接等待時間。如果超過此時間将接到異常。設為-1表示無限制。
          minEvictableIdleTimeMillis: 300000         #連接配接的最小空閑時間 預設1800000毫秒(30分鐘)
          numTestsPerEvictionRun: 1024             # 每次逐出檢查時 逐出的最大數目 如果為負數就是 : 1/abs(n), 預設3
          timeBetweenEvictionRunsMillis: 30000      #逐出掃描的時間間隔(毫秒) 如果為負數,則不運作逐出線程, 預設-1
          testOnBorrow: true                         #是否在從池中取出連接配接前進行檢驗,如果檢驗失敗,則從池中去除連接配接并嘗試取出另一個
          testWhileIdle: true                     #在空閑時檢查有效性, 預設false
          mymaster:
            masterName: mymaster
          sentinel:
              hostName: 127.0.0.1
              port: 26379
               
    3.config類配置redis資訊
    @Configuration
        public class RedisConfig {
    
        @Value("${redis.maxIdle}")
        private Integer maxIdle;
    
        @Value("${redis.maxTotal}")
        private Integer maxTotal;
    
        @Value("${redis.maxWaitMillis}")
        private Integer maxWaitMillis;
    
        @Value("${redis.minEvictableIdleTimeMillis}")
        private Integer minEvictableIdleTimeMillis;
    
        @Value("${redis.numTestsPerEvictionRun}")
        private Integer numTestsPerEvictionRun;
    
        @Value("${redis.timeBetweenEvictionRunsMillis}")
        private long timeBetweenEvictionRunsMillis;
    
        @Value("${redis.testOnBorrow}")
        private boolean testOnBorrow;
    
        @Value("${redis.testWhileIdle}")
        private boolean testWhileIdle;
    
    
        @Value("${redis.mymaster.masterName}")
        private String masterName;
    
        @Value("${redis.sentinel.hostName}")
        private String sentinelHostName;
        @Value("${redis.sentinel.port}")
        private int sentinelport;
    
    
        /**
         * JedisPoolConfig 連接配接池
         *
         * @return
         */
        @Bean
        public JedisPoolConfig jedisPoolConfig() {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            // 最大空閑數
            jedisPoolConfig.setMaxIdle(maxIdle);
            // 連接配接池的最大資料庫連接配接數
            jedisPoolConfig.setMaxTotal(maxTotal);
            // 最大建立連接配接等待時間
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            // 逐出連接配接的最小空閑時間 預設1800000毫秒(30分鐘)
            jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            // 每次逐出檢查時 逐出的最大數目 如果為負數就是 : 1/abs(n), 預設3
            jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
            // 逐出掃描的時間間隔(毫秒) 如果為負數,則不運作逐出線程, 預設-1
            jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            // 是否在從池中取出連接配接前進行檢驗,如果檢驗失敗,則從池中去除連接配接并嘗試取出另一個
            jedisPoolConfig.setTestOnBorrow(testOnBorrow);
            // 在空閑時檢查有效性, 預設false
            jedisPoolConfig.setTestWhileIdle(testWhileIdle);
            return jedisPoolConfig;
        }
    
        /**
         * 配置redis的哨兵
         *
         */
        @Bean
        public RedisSentinelConfiguration sentinelConfiguration() {
            RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
    //        配置redis的哨兵sentinel
            RedisNode senRedisNode = new RedisNode(sentinelHostName, sentinelport);
            Set<RedisNode> redisNodeSet = new HashSet<>();
            redisNodeSet.add(senRedisNode);
            redisSentinelConfiguration.setSentinels(redisNodeSet);
            redisSentinelConfiguration.setMaster(masterName);
            return redisSentinelConfiguration;
        }
    
        /**
         * 配置工廠
         *
         * @param jedisPoolConfig
         * @return
         */
        @Bean
        public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig, RedisSentinelConfiguration sentinelConfig) {
            JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(sentinelConfig, jedisPoolConfig);
            return jedisConnectionFactory;
        }
    
        /**
         * 執行個體化 RedisTemplate 對象
         *
         * @return
         */
        @Bean
        public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
            return redisTemplate;
        }
    
        /**
         * 設定資料存入 redis 的序列化方式,并開啟事務
         *
         * @param redisTemplate
         * @param factory
         */
        private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
            //如果不配置Serializer,那麼存儲的時候預設使用String,如果用User類型存儲,那麼會提示錯誤User can't cast to String!
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            // 開啟事務
            redisTemplate.setEnableTransactionSupport(true);
            redisTemplate.setConnectionFactory(factory);
        }
    
        /**
         * 封裝RedisTemplate
         *
         */
        @Bean(name = "redisUtils")
        public RedisUtils redisUtil(RedisTemplate<String, Object> redisTemplate) {
            RedisUtils redisUtil = new RedisUtils();
            redisUtil.setRedisTemplate(redisTemplate);
            return redisUtil;
        }
    
    
    }
               
    4.utils 配置 redisTemplate并且書寫工具類
    import org.springframework.data.redis.core.*;
    import java.io.Serializable;
    import java.util.List;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    public class RedisUtils {
    
       private RedisTemplate redisTemplate;
    
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    
    public  String  buildStringToken(String preString , String token){
        StringBuilder sb = new StringBuilder();
        sb.append(preString);
        sb.append(":");
        sb.append(token);
        return  sb.toString();
    }
    
    /**
     * 寫入緩存
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 寫入緩存設定時效時間
     * @param key
     * @param value
     * @return
     */
    public boolean set(final String key, Object value, Long expireTime ,TimeUnit timeUnit) {
        boolean result = false;
        try {
            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
            operations.set(key, value,5555L,TimeUnit.DAYS);
            redisTemplate.expire(key, expireTime, timeUnit);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * 批量删除對應的value
     * @param keys
     */
    public void remove(final String... keys) {
        for (String key : keys) {
            remove(key);
        }
    }
    
    /**
     * 批量删除key
     * @param pattern
     */
    public void removePattern(final String pattern) {
        Set<Serializable> keys = redisTemplate.keys(pattern);
        if (keys.size() > 0){
            redisTemplate.delete(keys);
        }
    }
    /**
     * 删除對應的value
     * @param key
     */
    public void remove(final String key) {
        if (exists(key)) {
            redisTemplate.delete(key);
        }
    }
    /**
     * 判斷緩存中是否有對應的value
     * @param key
     * @return
     */
    public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
    }
    /**
     * 讀取緩存
     * @param key
     * @return
     */
    public Object get(final String key) {
        Object result = null;
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
    }
    
    /**
     * 哈希 添加
     * @param key
     * @param hashKey
     * @param value
     */
    public void hmSet(String key, Object hashKey, Object value){
        HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
        hash.put(key,hashKey,value);
    }
    
    /**
     * 哈希擷取資料
     * @param key
     * @param hashKey
     * @return
     */
    public Object hmGet(String key, Object hashKey){
        HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();
        return hash.get(key,hashKey);
    }
    
    /**
     * 清單添加
     * @param k
     * @param v
     */
    public void lPush(String k,Object v){
        ListOperations<String, Object> list = redisTemplate.opsForList();
        list.rightPush(k,v);
    }
    
    /**
     * 清單擷取
     * @param k
     * @param l
     * @param l1
     * @return
     */
    public List<Object> lRange(String k, long l, long l1){
        ListOperations<String, Object> list = redisTemplate.opsForList();
        return list.range(k,l,l1);
    }
    
    /**
     * 集合添加
     * @param key
     * @param value
     */
    public void add(String key,Object value){
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        set.add(key,value);
    }
    
    /**
     * 集合擷取
     * @param key
     * @return
     */
    public Set<Object> setMembers(String key){
        SetOperations<String, Object> set = redisTemplate.opsForSet();
        return set.members(key);
    }
    
    /**
     * 有序集合添加
     * @param key
     * @param value
     * @param scoure
     */
    public void zAdd(String key,Object value,double scoure){
        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
        zset.add(key,value,scoure);
    }
    
    /**
     * 有序集合擷取
     * @param key
     * @param scoure
     * @param scoure1
     * @return
     */
        public Set<Object> rangeByScore(String key,double scoure,double scoure1){
            ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
            return zset.rangeByScore(key, scoure, scoure1);
        }
    }
               

繼續閱讀