Springboot2.x.x连接Redis配置整合 目录: 1、必看前言 对于整篇文章要解决的问题要有一个基础的认知 对于lettuce-pool你使用的到底是不是pool 了解springboot2.x.x各个版本存在的问题 2、springb
Springboot2.x.x连接Redis配置整合
目录:
1、必看前言
- 对于整篇文章要解决的问题要有一个基础的认知
- 对于lettuce-pool你使用的到底是不是pool
- 了解springboot2.x.x各个版本存在的问题
2、springboot2.x.x - lettuce连接Redis配置方式
3、springboot2.x.x - jedis连接Redis配置方式
1.1.0:对于整篇文章要解决的问题要有一个基础的认知
1.Redis分成 单实例连接 和 集群连接 两种方式,连接方式是不一样的 2.对于两种连接方式通用的配置就是 资源池设置 和 客户端名称设置 资源池设置: 为了统一管理客户端的连接数及合理调度资源使用 客户端名称设置: a.当不同的项目使用同一个redis的时候,一旦redis出现了业务上的tps增长,客户端连接数增长,bigkey阻塞,如果设置了clientName可以快速的定位到是哪个连接的客户端引起的 b.对于云部署的容器可能存在获取不到客户端的真实ip的情况,所以设置clientName是最好区分的方式 3.对于集群来说,客户端除了要维护资源池的配置还要考虑到服务端集群如果做出了更改,客户端要及时响应刷新本地的集群信息, 这就涉及到了客户端要设置redis集群的拓扑刷新问题,springboot2.x的不同版本有不同的变化刷新 4.对于使用lettuce pool配置时,你的配置是否真的生效,测试之后再说结论,这么说了肯定是不生效,需要进行配置才会生效,下边也会提到 5.除了以上不同springboot版本对应的redis的配置不同之外,还有一个问题就是序列化的问题,string类型的序列化就是使用string序列化的方式, 但是对于其余类型来说使用的是jdk的序列化方式,所以无论对于哪种版本我们都需要重写一下序列化方式
1.1.1:对于lettuce-pool你使用的到底是不是pool
我们在设置lettuce-pool的时候,对比jedis会有两个问题,对这两个问题提出解决方案 1.min-idle不生效 2.线程数一直不增长,pool的配置不生效
1.1.2:了解springboot2.x.x各个版本存在的问题
redis集群的拓扑刷新问题,只存在于lettuce的连接方式,jedis是将集群信息放入缓存中的,找不到对应的节点信息的时候会去重新获取刷新缓存, 在springboot2.3.x以后的版本添加了拓扑刷新的配置,在2.3.x之前的版本需要自己在config文件中去开启刷新 客户端名称配置,在springboot2.2.x以后的版本已经添加了配置,不需要重写配置,2.2.x之前的版本需要重写配置
2.2.1:springboot2.x.x - lettuce连接Redis配置方式
连接需要两个文件, application.yml 配置文件和 RedisConfig.java类
下面描述的 springboot2.x.x各个版本的 RedisConfig.java 类的内容都是以当前的RedisConfig.java类内容为基础的.
公共配置:
@Configuration public class RedisConfig { /** * lettuce pool springboot2.x.x 获取pool的工具类 */ public GenericObjectPoolConfig getGenericObjectLettucePoolConfig(RedisProperties redisProperties){ GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig(); genericObjectPoolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle()); genericObjectPoolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle()); genericObjectPoolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive()); genericObjectPoolConfig.setMaxWaitMillis(redisProperties.getLettuce().getPool().getMaxWait().toMillis()); //默认值为false,在获取连接之前检测是否为有效连接,tps很高的应用可以使用默认值 genericObjectPoolConfig.setTestOnBorrow(false); genericObjectPoolConfig.setTestOnReturn(false); //使用lettuce pool的配置的,需要打开此配置,用于检测控线连接并回收 genericObjectPoolConfig.setTestWhileIdle(true); return genericObjectPoolConfig; } /** * 自定义序列化方式 */ @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 使用Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 初始化string的序列化方式 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 redisTemplate.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 redisTemplate.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson redisTemplate.setValueSerializer(stringRedisSerializer); // hash的value序列化方式采用jackson redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
springboot2.3.x-lettuce 配置: