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

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

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

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

第一步:

第二步:

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

2. yaml配置
#yaml配置
spring: redis: database: 0          cluster: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 #集群节点password: xxxx     #密码jedis:pool:max-active: 10  #连接池最大连接数  max-idle: 8     #连接池中最大空闲连接数max-wait: -1    #连接池最大等待阻塞时间min-idle: 0     #连接池中最小空闲数timeout: 5000      #访问超时时间
3. 配置RedisTemplate
 @Value("${spring.redis.cluster.nodes}")private String host;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.timeout}")private int connectionTimeout;@Value("${spring.redis.jedis.pool.max-active}")private int maxTotal;@Value("${spring.redis.jedis.pool.min-idle}")private int minIdle;@Value("${spring.redis.jedis.pool.max-idle}")private int maxIdle;@Value("${spring.redis.jedis.pool.max-wait}")private int maxWaitMillis;@Beanpublic RedisClusterConfiguration redisClusterConfiguration() {RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();String[] hosts = host.split(",");Set<RedisNode> nodeList = new HashSet<RedisNode>();for (String hostAndPort : hosts) {String[] hostOrPort = hostAndPort.split(":");nodeList.add(new RedisNode(hostOrPort[0], Integer.parseInt(hostOrPort[1])));}redisClusterConfiguration.setClusterNodes(nodeList);
//      redisClusterConfiguration.setMaxRedirects();return redisClusterConfiguration;}@Beanpublic JedisPoolConfig jedisPoolConfig() {JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxIdle(this.maxIdle);poolConfig.setMinIdle(this.minIdle);poolConfig.setTestOnCreate(true);poolConfig.setTestOnBorrow(true);poolConfig.setTestOnReturn(true);poolConfig.setTestWhileIdle(true);return poolConfig;}@Bean("myJedisConnectionFactory")public JedisConnectionFactory jedisConnectionFactory(RedisClusterConfiguration redisClusterConfiguration,JedisPoolConfig jedisPoolConfig) {JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisClusterConfiguration, jedisPoolConfig);jedisConnectionFactory.setPassword(password);return jedisConnectionFactory;}@BeanRedisTemplate<String, Serializable> redisTemplate(@Qualifier("myJedisConnectionFactory")JedisConnectionFactory jedisConnectionFactory) {RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(jedisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);// 设置值(value)的序列化采用Jackson2JsonRedisSerializer。redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// 设置键(key)的序列化采用StringRedisSerializer。redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}@Beanpublic CacheManager cacheManager(@Qualifier("myJedisConnectionFactory")JedisConnectionFactory jedisConnectionFactory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));return RedisCacheManager.builder(jeddisConnectionFactory).cacheDefaults(redisCacheConfiguration).build();}
大功告成!

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

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

SpringBoot配置redis集群(Jedis and lettuce)相关推荐

  1. SpringBoot 配置redis集群

    导入依赖 <!--Springboot集成 Redis ,Springboot2.x默认是用Lettuce连接redis,Lettuce可伸缩,线程安全--> <dependency ...

  2. springboot整合redis集群master宕机后连接超时

    前提: #        本文是在确保redis集群配置正确的情况下,连接超时的解决方案. 项目登录认证使用的是sa-token(这个不重要,主要说的是springboot和redis集群),最近应甲 ...

  3. springboot集成redis集群实现集群拓扑动态刷新

    一个redis-cluster的三主三从集群,在其中一个master节点挂了之后,springboot集成redis集群配置信息没有及时刷新,出现读取操作报错.下面聊聊如何实现springboot集成 ...

  4. java集群解析文件_java相关:springboot整合redis集群过程解析

    java相关:springboot整合redis集群过程解析 发布于 2020-4-13| 复制链接 摘记: 简介 在springboot使用搭建好的redis集群添加redis和连接池依赖 ```x ...

  5. springboot连接redis集群

    开启redis服务和客户端 查看下当前redis的进程 [root@localhost ~]# ps -ef | grep redis 启动redis服务 [root@localhost ~]# cd ...

  6. SpringBoot整合Redis集群版本问题

    QUESTION:SpringBoot整合Redis集群版本问题? ANSWER: 版本依赖: <dependencies><!-- https://mvnrepository.co ...

  7. 什么是slot槽节点、Springboot集成Redis集群

    一. 什么是slot槽节点 slots:槽,用于装数据,主节点有,从节点没有 1.怎么分配slot? --平均分配 需要注意的是,槽节点是分配给master节点的,slave节点没有.  2.槽slo ...

  8. windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error...

    windows下配置redis集群,启动节点报错:createing server TCP listening socket *:7000:listen:Unknown error 学习了:https ...

  9. springboot篇】二十二. springboot整合Redis集群

    springboot整合Redis集群 **中国加油,武汉加油!** 案例准备 1. 新建Springboot项目springboot-redis-sentinel 2. 编写yml 3. Test ...

最新文章

  1. [好东西]使用ngrok把本机的网站端口映射到外网
  2. TQ210——常见问题
  3. 计算机系统结构 期末复习
  4. java的异常处理块的形式_Java 异常处理详细解读
  5. python连接不上数据库_绕不过去的Python连接MySQL数据库
  6. Android学习笔记---13_文件的操作模式.各个应用之间的文件权限
  7. 你会几种“复制”文本的方式?----浅谈I/O流
  8. 实现发送邮件动态html内容的几种思路
  9. SLAM--Pangolin显示相机位姿
  10. 基于python的网易云音乐下载器
  11. html设置input透明背景,input背景透明的穿透问题_html/css_WEB-ITnose
  12. regester正则用法_Regester下载|Regester(正则表达式测试器) 官方版v2.0.1 下载_当游网...
  13. 服务器如何防止被攻击
  14. Swift 下标用法
  15. Apache FOP 将Java对象转换为pdf文件
  16. 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树
  17. JSP实验室预约管理系统
  18. java计算 月数_Java 计算开始年月到结束年月期间的年月数
  19. 达梦数据库(DM)——表空间管理命令大全
  20. Docker下搭建XSS挑战之旅靶场

热门文章

  1. 世界杯梦幻阵容html代码,西班牙名帅评世界杯梦幻阵容:梅西C罗无争议
  2. Linux操作系统知识点(上)
  3. 病毒分析与防护实验2—— 搭建反病毒实验室
  4. java SNS网络系统_JEESNS-JAVA开源SNS社交管理系统
  5. 算法竞赛入门经典:第七章 暴力求解法 7.7解答树
  6. 谷歌收购七家科技公司 秘密打造机器人帝国
  7. 仿腾讯手机管家快捷中心功能的实现方案
  8. 宝塔部署出现404 not found解决方法
  9. 【初探篇】反向代理在系统结构中的应用场景
  10. Android开发板 MTK 4g/5g 安卓开发板定制