SpringBoot配置redis集群(Jedis and lettuce)

Love The Way You Lie 2022-12-26 11:28 459阅读 0赞

SpringBoot2.x版本配置redis集群(Jedis and lettuce)

在SpringBoot1.x版本中,springboot默认使用集成jedis,在SpringBoot2.x版本中,SpringBoot默认集成lettuce。

Jedis vs Lettuce
  1. 1. Jedis使用直连方式连接Redis Server,在多线程环境下存在线程安全问题,需要增加连接池创建Jedis客户端多实例线程安全问题,基于传统I/O模式,是阻塞式传输!
  2. 2. Lettuce的连接是基于netty,在多线程环境下不存在线程安全问题,这个连接实例当然也是可伸缩的设计,也可以增加多实例连接,netty本身就基于NIO,从而提供了异步和同步数据访问方式,用于构建非阻塞的反应性应用程序。
使用SpringBoot2.3.4,Lettuce配置redis集群。
1. pom.xml配置
  1. <properties>
  2. <spring-boot.version>2.3.4.RELEASE</spring-boot.version>
  3. <commons-pool.version>2.5.0</commons-pool.version>
  4. </properties>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-data-redis</artifactId>
  8. <version>${spring-boot.version}</version>
  9. </dependency>
  10. <!-- 依赖commons-pool2连接池 -->
  11. <dependency>
  12. <groupId>org.apache.commons</groupId>
  13. <artifactId>commons-pool2</artifactId>
  14. <version>${commons-pool.version}</version>
  15. </dependency>
2. yaml配置
  1. #yaml配置
  2. spring:
  3. redis:
  4. database: 0
  5. cluster:
  6. nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006 #集群节点
  7. password: xxxx #密码
  8. lettuce:
  9. pool:
  10. max-active: 10 #连接池最大连接数
  11. max-idle: 8 #连接池中最大空闲连接数
  12. max-wait: -1ms #连接池最大等待阻塞时间
  13. min-idle: 0 #连接池中最小空闲数
  14. timeout: 5000 #访问超时时间
3. 配置RedisTemplate
  1. @Configuration
  2. public class RedisConfig {
  3. @Bean
  4. RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
  5. RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
  6. redisTemplate.setConnectionFactory(redisConnectionFactory);
  7. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  8. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  9. redisTemplate.setKeySerializer(new StringRedisSerializer());
  10. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  11. redisTemplate.afterPropertiesSet();
  12. return redisTemplate;
  13. }
  14. @Bean
  15. public CacheManager cacheManager(LettuceConnectionFactory factory) {
  16. // 配置序列化
  17. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
  18. RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
  19. return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
  20. }
  21. }
Jedis配置redis集群
1. pom.xml配置、
  1. <properties>
  2. <spring-boot.version>2.3.4.RELEASE</spring-boot.version>
  3. <jedis.version>3.3.0</jedis.version>
  4. </properties>
  5. <!-- 引入jedis客户端,需要把lettuce客户端移除 -->
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-data-redis</artifactId>
  9. <version>${spring-boot.version}</version>
  10. <exclusions>
  11. <exclusion>
  12. <groupId>io.lettuce</groupId>
  13. <artifactId>lettuce-core</artifactId>
  14. </exclusion>
  15. </exclusions>
  16. </dependency>
  17. <dependency>
  18. <groupId>redis.clients</groupId>
  19. <artifactId>jedis</artifactId>
  20. <version>${jedis.version}</version>
  21. </dependency>

注:这里有一个比较坑的地方,导入的Jedis版本必须要和springboot版本兼容,需要点入spring-boot-starter-data-redis的pom文件查看spring-data-redis,然后继续点击spring-data-redis查看对应jedis版本

第一步:
C:\\Users\\gaobo2\\AppData\\Roaming\\Typora\\typora-user-images\\image-20201205170147141.png
第二步:
在这里插入图片描述

第三步:就可以查看到当前springboot对应哪一个jedis版本,然后在自己的pom中引入和这个redis对应的版本。
在这里插入图片描述

2. yaml配置
  1. #yaml配置
  2. spring:
  3. redis:
  4. database: 0
  5. cluster:
  6. nodes: 127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006 #集群节点
  7. password: xxxx #密码
  8. jedis:
  9. pool:
  10. max-active: 10 #连接池最大连接数
  11. max-idle: 8 #连接池中最大空闲连接数
  12. max-wait: -1 #连接池最大等待阻塞时间
  13. min-idle: 0 #连接池中最小空闲数
  14. timeout: 5000 #访问超时时间
3. 配置RedisTemplate
  1. @Value("${spring.redis.cluster.nodes}")
  2. private String host;
  3. @Value("${spring.redis.password}")
  4. private String password;
  5. @Value("${spring.redis.timeout}")
  6. private int connectionTimeout;
  7. @Value("${spring.redis.jedis.pool.max-active}")
  8. private int maxTotal;
  9. @Value("${spring.redis.jedis.pool.min-idle}")
  10. private int minIdle;
  11. @Value("${spring.redis.jedis.pool.max-idle}")
  12. private int maxIdle;
  13. @Value("${spring.redis.jedis.pool.max-wait}")
  14. private int maxWaitMillis;
  15. @Bean
  16. public RedisClusterConfiguration redisClusterConfiguration() {
  17. RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
  18. String[] hosts = host.split(",");
  19. Set<RedisNode> nodeList = new HashSet<RedisNode>();
  20. for (String hostAndPort : hosts) {
  21. String[] hostOrPort = hostAndPort.split(":");
  22. nodeList.add(new RedisNode(hostOrPort[0], Integer.parseInt(hostOrPort[1])));
  23. }
  24. redisClusterConfiguration.setClusterNodes(nodeList);
  25. // redisClusterConfiguration.setMaxRedirects();
  26. return redisClusterConfiguration;
  27. }
  28. @Bean
  29. public JedisPoolConfig jedisPoolConfig() {
  30. JedisPoolConfig poolConfig = new JedisPoolConfig();
  31. poolConfig.setMaxIdle(this.maxIdle);
  32. poolConfig.setMinIdle(this.minIdle);
  33. poolConfig.setTestOnCreate(true);
  34. poolConfig.setTestOnBorrow(true);
  35. poolConfig.setTestOnReturn(true);
  36. poolConfig.setTestWhileIdle(true);
  37. return poolConfig;
  38. }
  39. @Bean("myJedisConnectionFactory")
  40. public JedisConnectionFactory jedisConnectionFactory(RedisClusterConfiguration redisClusterConfiguration,
  41. JedisPoolConfig jedisPoolConfig) {
  42. JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(
  43. redisClusterConfiguration, jedisPoolConfig);
  44. jedisConnectionFactory.setPassword(password);
  45. return jedisConnectionFactory;
  46. }
  47. @Bean
  48. RedisTemplate<String, Serializable> redisTemplate(@Qualifier("myJedisConnectionFactory")JedisConnectionFactory jedisConnectionFactory) {
  49. RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
  50. redisTemplate.setConnectionFactory(jedisConnectionFactory);
  51. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  52. // 设置值(value)的序列化采用Jackson2JsonRedisSerializer。
  53. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  54. // 设置键(key)的序列化采用StringRedisSerializer。
  55. redisTemplate.setKeySerializer(new StringRedisSerializer());
  56. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  57. redisTemplate.afterPropertiesSet();
  58. return redisTemplate;
  59. }
  60. @Bean
  61. public CacheManager cacheManager(@Qualifier("myJedisConnectionFactory")JedisConnectionFactory jedisConnectionFactory) {
  62. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
  63. RedisCacheConfiguration redisCacheConfiguration = config
  64. .serializeKeysWith(
  65. RedisSerializationContext.SerializationPair
  66. .fromSerializer(new StringRedisSerializer()))
  67. .serializeValuesWith(
  68. RedisSerializationContext.SerializationPair
  69. .fromSerializer(new GenericJackson2JsonRedisSerializer()));
  70. return RedisCacheManager.builder(jeddisConnectionFactory)
  71. .cacheDefaults(redisCacheConfiguration).build();
  72. }
大功告成!

项目中直接注入RedisTemplate就可以使用,具体网上步骤很多,在这里不展开来说。

本文只记录相关配置,后续有时间会做源码分析和大家分享,文中如有错误之处,欢迎指出。

发表评论

表情:
评论列表 (有 0 条评论,459人围观)

还没有评论,来说两句吧...

相关阅读