Springboot整合redis

https://blog.csdn.net/plei_yue/article/details/79362372

前言在本篇文章中将SpringBoot整合Redis,使用的是RedisTemplate,分别实现了SpringBoot与redis的单机版、集群版、哨兵模式的整合。
Maven依赖<!-- 整合redis -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-redis</artifactId>        </dependency>12345项目下载及目录结构1.[SpringBoot整合Redis实例] (http://download.csdn.net/download/plei_yue/10257285)  2.Redis安装和相关配置参考
修改配置文件创建一个redis.properties配置文件。
#Matser的ip地址  redis.hostName=192.168.177.128#端口号  redis.port=6382#如果有密码  redis.password=#客户端超时时间单位是毫秒 默认是2000 redis.timeout=10000  
#最大空闲数  redis.maxIdle=300  #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal  #redis.maxActive=600  #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性  redis.maxTotal=1000  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  redis.maxWaitMillis=1000  #连接的最小空闲时间 默认1800000毫秒(30分钟)  redis.minEvictableIdleTimeMillis=300000  #每次释放连接的最大数目,默认3  redis.numTestsPerEvictionRun=1024  #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1  redis.timeBetweenEvictionRunsMillis=30000  #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个  redis.testOnBorrow=true  #在空闲时检查有效性, 默认false  redis.testWhileIdle=true  
#redis集群配置      spring.redis.cluster.nodes=192.168.177.128:7001,192.168.177.128:7002,192.168.177.128:7003,192.168.177.128:7004,192.168.177.128:7005,192.168.177.128:7006spring.redis.cluster.max-redirects=3
#哨兵模式#redis.sentinel.host1=192.168.177.128#redis.sentinel.port1=26379
#redis.sentinel.host2=172.20.1.231  #redis.sentinel.port2=263791234567891011121314151617181920212223242526272829303132333435363738封装RedisTemplate的RedisUtil类import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.TimeUnit;
import org.springframework.data.redis.core.RedisTemplate;import org.springframework.util.CollectionUtils;
public class RedisUtil {
private RedisTemplate<String, Object> redisTemplate;  
    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {          this.redisTemplate = redisTemplate;      }      //=============================common============================      /**      * 指定缓存失效时间      * @param key 键      * @param time 时间(秒)      * @return      */      public boolean expire(String key,long time){          try {              if(time>0){                  redisTemplate.expire(key, time, TimeUnit.SECONDS);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 根据key 获取过期时间      * @param key 键 不能为null      * @return 时间(秒) 返回0代表为永久有效      */      public long getExpire(String key){          return redisTemplate.getExpire(key,TimeUnit.SECONDS);      }  
    /**      * 判断key是否存在      * @param key 键      * @return true 存在 false不存在      */      public boolean hasKey(String key){          try {              return redisTemplate.hasKey(key);          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 删除缓存      * @param key 可以传一个值 或多个      */      @SuppressWarnings("unchecked")      public void del(String ... key){          if(key!=null&&key.length>0){              if(key.length==1){                  redisTemplate.delete(key[0]);              }else{                  redisTemplate.delete(CollectionUtils.arrayToList(key));              }          }      }  
    //============================String=============================      /**      * 普通缓存获取      * @param key 键      * @return 值      */      public Object get(String key){          return key==null?null:redisTemplate.opsForValue().get(key);      }  
    /**      * 普通缓存放入      * @param key 键      * @param value 值      * @return true成功 false失败      */      public boolean set(String key,Object value) {           try {              redisTemplate.opsForValue().set(key, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }  
    }  
    /**      * 普通缓存放入并设置时间      * @param key 键      * @param value 值      * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期      * @return true成功 false 失败      */      public boolean set(String key,Object value,long time){          try {              if(time>0){                  redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);              }else{                  set(key, value);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 递增      * @param key 键      * @param by 要增加几(大于0)      * @return      */      public long incr(String key, long delta){            if(delta<0){              throw new RuntimeException("递增因子必须大于0");          }          return redisTemplate.opsForValue().increment(key, delta);      }  
    /**      * 递减      * @param key 键      * @param by 要减少几(小于0)      * @return      */      public long decr(String key, long delta){            if(delta<0){              throw new RuntimeException("递减因子必须大于0");          }          return redisTemplate.opsForValue().increment(key, -delta);        }    
    //================================Map=================================      /**      * HashGet      * @param key 键 不能为null      * @param item 项 不能为null      * @return 值      */      public Object hget(String key,String item){          return redisTemplate.opsForHash().get(key, item);      }  
    /**      * 获取hashKey对应的所有键值      * @param key 键      * @return 对应的多个键值      */      public Map<Object,Object> hmget(String key){          return redisTemplate.opsForHash().entries(key);      }  
    /**      * HashSet      * @param key 键      * @param map 对应多个键值      * @return true 成功 false 失败      */      public boolean hmset(String key, Map<String,Object> map){            try {              redisTemplate.opsForHash().putAll(key, map);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * HashSet 并设置时间      * @param key 键      * @param map 对应多个键值      * @param time 时间(秒)      * @return true成功 false失败      */      public boolean hmset(String key, Map<String,Object> map, long time){            try {              redisTemplate.opsForHash().putAll(key, map);              if(time>0){                  expire(key, time);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 向一张hash表中放入数据,如果不存在将创建      * @param key 键      * @param item 项      * @param value 值      * @return true 成功 false失败      */      public boolean hset(String key,String item,Object value) {           try {              redisTemplate.opsForHash().put(key, item, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 向一张hash表中放入数据,如果不存在将创建      * @param key 键      * @param item 项      * @param value 值      * @param time 时间(秒)  注意:如果已存在的hash表有时间,这里将会替换原有的时间      * @return true 成功 false失败      */      public boolean hset(String key,String item,Object value,long time) {           try {              redisTemplate.opsForHash().put(key, item, value);              if(time>0){                  expire(key, time);              }              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 删除hash表中的值      * @param key 键 不能为null      * @param item 项 可以使多个 不能为null      */      public void hdel(String key, Object... item){            redisTemplate.opsForHash().delete(key,item);      }   
    /**      * 判断hash表中是否有该项的值      * @param key 键 不能为null      * @param item 项 不能为null      * @return true 存在 false不存在      */      public boolean hHasKey(String key, String item){          return redisTemplate.opsForHash().hasKey(key, item);      }   
    /**      * hash递增 如果不存在,就会创建一个 并把新增后的值返回      * @param key 键      * @param item 项      * @param by 要增加几(大于0)      * @return      */      public double hincr(String key, String item,double by){            return redisTemplate.opsForHash().increment(key, item, by);      }  
    /**      * hash递减      * @param key 键      * @param item 项      * @param by 要减少记(小于0)      * @return      */      public double hdecr(String key, String item,double by){            return redisTemplate.opsForHash().increment(key, item,-by);        }    
    //============================set=============================      /**      * 根据key获取Set中的所有值      * @param key 键      * @return      */      public Set<Object> sGet(String key){          try {              return redisTemplate.opsForSet().members(key);          } catch (Exception e) {              e.printStackTrace();              return null;          }      }  
    /**      * 根据value从一个set中查询,是否存在      * @param key 键      * @param value 值      * @return true 存在 false不存在      */      public boolean sHasKey(String key,Object value){          try {              return redisTemplate.opsForSet().isMember(key, value);          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 将数据放入set缓存      * @param key 键      * @param values 值 可以是多个      * @return 成功个数      */      public long sSet(String key, Object...values) {          try {              return redisTemplate.opsForSet().add(key, values);          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }  
    /**      * 将set数据放入缓存      * @param key 键      * @param time 时间(秒)      * @param values 值 可以是多个      * @return 成功个数      */      public long sSetAndTime(String key,long time,Object...values) {          try {              Long count = redisTemplate.opsForSet().add(key, values);              if(time>0) expire(key, time);              return count;          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }  
    /**      * 获取set缓存的长度      * @param key 键      * @return      */      public long sGetSetSize(String key){          try {              return redisTemplate.opsForSet().size(key);          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }  
    /**      * 移除值为value的      * @param key 键      * @param values 值 可以是多个      * @return 移除的个数      */      public long setRemove(String key, Object ...values) {          try {              Long count = redisTemplate.opsForSet().remove(key, values);              return count;          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }      //===============================list=================================  
    /**      * 获取list缓存的内容      * @param key 键      * @param start 开始      * @param end 结束  0 到 -1代表所有值      * @return      */      public List<Object> lGet(String key,long start, long end){          try {              return redisTemplate.opsForList().range(key, start, end);          } catch (Exception e) {              e.printStackTrace();              return null;          }      }  
    /**      * 获取list缓存的长度      * @param key 键      * @return      */      public long lGetListSize(String key){          try {              return redisTemplate.opsForList().size(key);          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }  
    /**      * 通过索引 获取list中的值      * @param key 键      * @param index 索引  index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推      * @return      */      public Object lGetIndex(String key,long index){          try {              return redisTemplate.opsForList().index(key, index);          } catch (Exception e) {              e.printStackTrace();              return null;          }      }  
    /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, Object value) {          try {              redisTemplate.opsForList().rightPush(key, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, Object value, long time) {          try {              redisTemplate.opsForList().rightPush(key, value);              if (time > 0) expire(key, time);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, List<Object> value) {          try {              redisTemplate.opsForList().rightPushAll(key, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 将list放入缓存      * @param key 键      * @param value 值      * @param time 时间(秒)      * @return      */      public boolean lSet(String key, List<Object> value, long time) {          try {              redisTemplate.opsForList().rightPushAll(key, value);              if (time > 0) expire(key, time);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }  
    /**      * 根据索引修改list中的某条数据      * @param key 键      * @param index 索引      * @param value 值      * @return      */      public boolean lUpdateIndex(String key, long index,Object value) {          try {              redisTemplate.opsForList().set(key, index, value);              return true;          } catch (Exception e) {              e.printStackTrace();              return false;          }      }   
    /**      * 移除N个值为value       * @param key 键      * @param count 移除多少个      * @param value 值      * @return 移除的个数      */      public long lRemove(String key,long count,Object value) {          try {              Long remove = redisTemplate.opsForList().remove(key, count, value);              return remove;          } catch (Exception e) {              e.printStackTrace();              return 0;          }      }  }123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524SpringBoot整合单机版redis如果我们只需要整合redis的单机版,只要在redis.conf中进行如下配置
@Configuration@PropertySource("classpath:config/redis.properties")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("${spring.redis.cluster.nodes}")    private String clusterNodes; 
    @Value("${spring.redis.cluster.max-redirects}")    private Integer mmaxRedirectsac;
    /**     * 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;    }    /**     * 单机版配置    * @Title: JedisConnectionFactory     * @param @param jedisPoolConfig    * @param @return    * @return JedisConnectionFactory    * @autor lpl    * @date 2018年2月24日    * @throws     */    @Bean    public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig){        JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);        //连接池          JedisConnectionFactory.setPoolConfig(jedisPoolConfig);          //IP地址          JedisConnectionFactory.setHostName("192.168.177.128");          //端口号          JedisConnectionFactory.setPort(6379);          //如果Redis设置有密码          //JedisConnectionFactory.setPassword(password);          //客户端超时时间单位是毫秒          JedisConnectionFactory.setTimeout(5000);          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    * @Title: redisUtil     * @return RedisUtil    * @autor lpl    * @date 2017年12月21日    * @throws     */    @Bean(name = "redisUtil")    public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {        RedisUtil redisUtil = new RedisUtil();        redisUtil.setRedisTemplate(redisTemplate);        return redisUtil;    }123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127SpringBoot整合Redis-Cluster集群@Configuration@PropertySource("classpath:config/redis.properties")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("${spring.redis.cluster.nodes}")    private String clusterNodes; 
    @Value("${spring.redis.cluster.max-redirects}")    private Integer mmaxRedirectsac;
    /**     * 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集群的配置    * @return RedisClusterConfiguration    * @autor lpl    * @date 2017年12月22日    * @throws     */    @Bean    public RedisClusterConfiguration redisClusterConfiguration(){        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();        //Set<RedisNode> clusterNodes        String[] serverArray = clusterNodes.split(",");
        Set<RedisNode> nodes = new HashSet<RedisNode>();
        for(String ipPort:serverArray){            String[] ipAndPort = ipPort.split(":");            nodes.add(new RedisNode(ipAndPort[0].trim(),Integer.valueOf(ipAndPort[1])));        }
        redisClusterConfiguration.setClusterNodes(nodes);        redisClusterConfiguration.setMaxRedirects(mmaxRedirectsac);
        return redisClusterConfiguration;    }    /**     * 配置工厂    * @Title: JedisConnectionFactory     * @param @param jedisPoolConfig    * @param @return    * @return JedisConnectionFactory    * @autor lpl    * @date 2017年12月22日    * @throws     */    @Bean    public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig,RedisClusterConfiguration redisClusterConfiguration){        JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration,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    * @Title: redisUtil     * @return RedisUtil    * @autor lpl    * @date 2017年12月21日    * @throws     */    @Bean(name = "redisUtil")    public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {        RedisUtil redisUtil = new RedisUtil();        redisUtil.setRedisTemplate(redisTemplate);        return redisUtil;    }123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143SpringBoot整合Redis的哨兵模式@Configuration@PropertySource("classpath:config/redis.properties")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("${spring.redis.cluster.nodes}")    private String clusterNodes; 
    @Value("${spring.redis.cluster.max-redirects}")    private Integer mmaxRedirectsac;
    /**     * 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的哨兵    * @return RedisSentinelConfiguration    * @autor lpl    * @date 2017年12月21日    * @throws     */    @Bean    public RedisSentinelConfiguration sentinelConfiguration(){        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();        //配置matser的名称        RedisNode redisNode = new RedisNode(hostName, port);        redisNode.setName("mymaster");        redisSentinelConfiguration.master(redisNode);        //配置redis的哨兵sentinel        RedisNode senRedisNode = new RedisNode(senHost1,senPort1);        Set<RedisNode> redisNodeSet = new HashSet<>();        redisNodeSet.add(senRedisNode);        redisSentinelConfiguration.setSentinels(redisNodeSet);        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    * @Title: redisUtil     * @return RedisUtil    * @autor lpl    * @date 2017年12月21日    * @throws     */    @Bean(name = "redisUtil")    public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {        RedisUtil redisUtil = new RedisUtil();        redisUtil.setRedisTemplate(redisTemplate);        return redisUtil;    }--------------------- 作者:w奔跑的蜗牛 来源:CSDN 原文:https://blog.csdn.net/plei_yue/article/details/79362372 版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/wangxiaocong/p/9809965.html