本文转载自微信公众号《Java极客技术》,作者鸭血范。转载本文请联系Java极客技术公众号。大家好,我是鸭血粉。Redis想必大家都不陌生。日常工作中或多或少都会用到。无论是用来存储登录信息,还是用来缓存热点数据,对我们来说都非常重要。有帮助。不过Redis集群估计不是所有人都会用到,因为很多业务场景或者系统都是简单的管理系统,并不需要使用Redis集群环境。之前的阿芬也是如此。项目中使用的Redis是单机环境,但是最近随着终端的增多,逐渐发现单机已经支持不了了,所以三思而后决定升级Redis环境到一个集群。接下来阿芬就给大家介绍一下升级过程中项目中需要调整的点。本文不涉及集群的搭建和配置。感兴趣的同学可以自行搜索。配置参数由于本文不介绍Redis集群的搭建,这里我们假设已经有Redis集群环境。在我们的项目中,需要调整以下部分,修改配置参数,集群节点和密码配置;确保导入的Jedis版本支持设置密码,spring-data-redis1.8以上,SpringBoot1.5以上可以支持设置密码;注入RedisTemplate;编写工具类;修改配置参数################Redis集群配置##########################spring.custome.redis.cluster.nodes=172.20.0.1:7001,172.20.0.2:7002,172.20.0.3:7003spring.custome.redis.cluster.max-redirects=3spring.custome.redis.cluster.max-active=500spring。custome.redis.cluster.max-wait=-1spring.custome.redis.cluster.max-idle=500spring。custome.redis.cluster.min-idle=20spring.custome.redis.cluster.timeout=3000spring.custome.redis.cluster.password=redis.cluster.password导入依赖项(如果需要)以确保SpringBoot版本大于1.4。xif如果没有,则使用如下配置,先排除SpringBoot中的旧版本Jedis和spring-data-redis,然后再依赖高版本的Jedis和spring-data-redis。org.springframework.bootspring-boot-starter-data-redisredis.clientsjedisorg.springframework.dataspring-data-redisredis.clientsjedis2.9.0org.springframework.dataspring-data-redis1.8.0.RELEASE注入RedisTemplate注入RedisTemplate我们需要三个组件,分别是JedisConnectionFactory,RedisClusterConfiguration,JedisPoolConfig,下面是注入RedisTempalte的代码先先根据配置创建jedisconnectFactory同时配置配置配置redisClusterConfiguration,jedispoolConfig,最后jedisconnection-factory返回.apache.commons.pool2.impl.GenericObjectPoolConfig;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Primary;importorg.springframework.data.redis.connection.RedisClusterConfiguration;importorg.springframework.data.redis.connection.RedisNode;importorg.springframework.data.redis.connection.jedis.JedisClientConfiguration;importorg.springframework.data.redis.connection.jedis.JedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;importjava.time.Duration;importjava.util.ArrayList;importjava.util.List;publicclassRedisClusterConfig{@Bean(name="redisTemplate")@PrimarypublicRedisTemplateredisClusterTemplate(@Value("${spring.custome.redis.cluster.nodes}")Stringhost,@Value("${spring.custome.redis.cluster.password}")Stringpassword,@Value("${spring.custome.redis.cluster.timeout}")longtimeout,@Value("${spring.custome.redis.cluster.max-redirects}")intmaxRedirect,@Value("${spring.custome.redis.cluster.max-active}")intmaxActive,@Value("${spring.custome.redis.cluster.max-wait}")intmaxWait,@Value("${spring.custome.redis.cluster.max-idle}")intmaxIdle,@Value("${spring.custome.redis.cluster.min-idle}")intminIdle){JedisConnectionFactoryconnectionFactory=jedisClusterConnectionFactory(host,password,timeout,maxRedirect,maxActive,maxWait,maxIdle,minIdle);returncreateRedisClusterTemplate(connectionFactory);}privateJedisConnectionFactoryjedisClusterConnectionFactory(Stringhost,Stringpassword,longtimeout,intmaxRedirect,intmaxActive,intmaxWait,intmaxIdle,intminIdle){RedisClusterConfigurationredisClusterConfiguration=newRedisClusterConfiguration();ListnodeList=newArrayList<>();String=host.cNodessplit(",");//分割出集合节点for(Stringnode:cNodes){String[]hp=node.split(":");nodeList.add(newRedisNode(hp[0],Integer.parseInt(hp[1])));}redisClusterConfiguration.setClusterNodes(nodeList);redisClusterConfiguration.setPassword(password);redisClusterConfiguration.setMaxRedirects(maxRedirect);//连接池通用配置GenericObjectPoolConfiggenericObjectPoolConfig=newGenericObjectPoolConfig();genericObjectPoolConfig.setMaxIdle(maxIdle.generic);setMaxTotal(maxActive);genericObjectPoolConfig.setMinIdle(minIdle);genericObjectPoolConfig.setMaxWaitMillis(maxWait);genericObjectPoolConfig.setTestWhileIdle(真);genericObjectPoolConfig.setTimeBetweenEvictionRunsMillis(300000);JedisClientConfiguration.DefaultJedisClientConfigurationBuilderbuilder=(JedisClientConfiguration.DefaultJedisClientConfigurationBuilder)JedisClientConfiguration.builder();builder.connectTimeout(Duration.ofSeconds(超时));builder.usePogenericPoololConfig();builderObject.PoololConfig());JedisConnectionFactoryconnectionFactory=newJedisConnectionFactory(redisClusterConfiguration,builder.build());//连接池初始化connectionFactory.afterPropertiesSet();returnconnectionFactory;}privateRedisTemplatecreateRedisClusterTemplate(JedisConnectionFactoryredisConnectionFactory){RedisTemplateredissetConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer<对象>jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer<>(Object.class);ObjectMapperom=newObjectMapper();om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);StringRedisSerializerstringRedisSerializer=newStringRedisSerializer();//key序列化使用StringredisTemplate.setKeyingSerializer;//hashkey也使用String序列化方法redisTemplate.setHashKeySerializer(stringRedisSerializer);//值序列化方法使用jacksonredisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//哈希值序列化方法使用jacksonredisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();returnredisTemplate;}}编写工具类到这里就基本完成了。我们可以看到,SpringBoot项目连接Redis集群还是比较简单的,而且如果之前单机环境使用的是RedisTemplate,那么现在就不用写工具类了,之前的操作依然有效,但是作为贴心爱好者,还是给大家准备了一个工具类,代码太长,我只贴出一部分,需要完整代码的可以回复公众号【源码仓库】获取。/***删除KEY*@paramkey*@return*/publicbooleandelete(Stringkey){try{returngetTemplate().delete(key);}catch(Exceptione){log.error("redishasKey()iserror");return错误的;}}/***普通缓存获取**@paramkeykey*@returnvalue*/publicObjectget(Stringkey){returnkey==null?null:getTemplate().opsForValue().get(key);}/***普通缓存放**@paramkeykey*@paramvaluevalue*@returntruesuccessfalsefailure*/publicbooleanset(Stringkey,Objectvalue){try{getTemplate().opsForValue().set(key,value);returntrue;}catch(Exceptione){log.error("redisset()iserror");returnfalse;}}/***放入正常缓存并设置时间**@paramkeykey*@paramvaluevalue*@paramtimetime(seconds)时间必须大于0如果时间小于等于0,则无限期设置*@returntrue成功false失败*/publicbooleanset(Stringkey,Objectvalue,longtime){try{if(time>0){getTemplate().opsForValue()。set(key,value,time,TimeUnit.SECONDS);}else{set(key,value);}returntrue;}catch(Exceptione){log.error("redisset()iserror");returnfalse;}}/***counter**@paramkeykey*@returnvalue*/publicLongincr(Stringkey){returngetTemplate().opsForValue().increment(key);}publicLongincrBy(Stringkey,longstep){returngetTemplate().opsForValue().increment(key,step);}/***HashGet**@paramkeykeycannotbenull*@paramitemitemcannotbenull*@returnvalue*/publicObjecthget(Stringkey,Stringitem){returngetTemplate().opsForHash().get(key,item);}/***获取hashKey对应的所有键值**@paramkeykey*@return对应tomorekeyvalue*/publicMap