最近项目尝试从SpringBoot1.X升级到SpringBoot2.X, 但是 Spring Boot 2.0中 Redis 客户端驱动现在由 Jedis变为了 Lettuce, 所以尝试测试一下Lettuce的使用. 下面简单介绍一下Lettuce.

Redis 三大客户端

简介

Jedis:是Redis 老牌的Java实现客户端,提供了比较全面的Redis命令的支持,

Redisson:实现了分布式和可扩展的Java数据结构。

Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。

优点:

Jedis:比较全面的提供了Redis的操作特性

Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过Redis支持延迟队列

Lettuce:主要在一些分布式缓存框架上使用比较多

可伸缩:

Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。 Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis 。

Redisson:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作

Lettuce:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作

pipeline 的支持

jedis 通过一定的改造后可以支持pipeline, 具体可以看 Redis 批量操作之 pipeline

但是 Lettuce 的pipeline行为很奇怪. 在 Spring RedisTemplate 中的 executePipelined 方法中的情况:

有时完全是一条一条命令地发送

有时全合并几条命令发送

但跟完全 pipeline 的方式不同, 测试多次, 但没发现有一次是完整 pipeline 的

复制代码

所以如果需要使用pipeline的话, 建议还是使用Jedis

Lettuce 接入

单机版

配置文件

host: 192.168.131.118

port: 4884

password: dsgs548

database: 0

# lettuce简单配置

lettuce:

pool:

# 最大活跃链接数 默认8

max-active: 5

# 最大空闲连接数 默认8

max-idle: 10

# 最小空闲连接数 默认0

min-idle: 0

复制代码

redis配置类

@Configuration

public class RedisConfig {

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

RedisTemplate template = new RedisTemplate<>();

template.setConnectionFactory(factory);

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

// key采用String的序列化方式

template.setKeySerializer(stringRedisSerializer);

// hash的key也采用String的序列化方式

template.setHashKeySerializer(stringRedisSerializer);

// value序列化方式采用jackson

template.setValueSerializer(jackson2JsonRedisSerializer);

// hash的value序列化方式采用jackson

template.setHashValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

}

复制代码

直接引入RedisTemplate 即可, 单机版比较简单

集群版+多数据源

配置文件

spring:

redis:

cluster:

nodes: 192.168.131.118:4883,192.168.131.118:4884,192.168.131.118:4885

# nodes:

# - 192.168.131.118:4883

# - 1192.168.131.118:4884

# - 192.168.131.118:4885

password: adfafsas

lettuce:

pool:

# 最大活跃链接数 默认8

max-active: 5

# 最大空闲连接数 默认8

max-idle: 10

# 最小空闲连接数 默认0

min-idle: 0

secondaryRedis:

cluster:

nodes: 192.168.131.118:4883,192.168.131.118:4884,192.168.131.118:4885

# nodes:

# - 192.168.131.118:4883

# - 192.168.131.118:4884

# - 192.168.131.118:4885

password: advfafasfsa

复制代码

redis配置类

@Configuration

public class RedisConfig {

@Autowired

private Environment environment;

/**

* 配置lettuce连接池

*

* @return

*/

@Bean

@Primary

@ConfigurationProperties(prefix = "spring.redis.cluster.lettuce.pool")

public GenericObjectPoolConfig redisPool() {

return new GenericObjectPoolConfig();

}

/**

* 配置第一个数据源的

*

* @return

*/

@Bean("redisClusterConfig")

@Primary

public RedisClusterConfiguration redisClusterConfig() {

Map source = new HashMap<>(8);

source.put("spring.redis.cluster.nodes", environment.getProperty("spring.redis.cluster.nodes"));

RedisClusterConfiguration redisClusterConfiguration;

redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));

redisClusterConfiguration.setPassword(environment.getProperty("spring.redis.password"));

return redisClusterConfiguration;

}

/**

* 配置第一个数据源的连接工厂

* 这里注意:需要添加@Primary 指定bean的名称,目的是为了创建两个不同名称的LettuceConnectionFactory

*

* @param redisPool

* @param redisClusterConfig

* @return

*/

@Bean("lettuceConnectionFactory")

@Primary

public LettuceConnectionFactory lettuceConnectionFactory(GenericObjectPoolConfig redisPool, @Qualifier("redisClusterConfig") RedisClusterConfiguration redisClusterConfig) {

LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(redisPool).build();

return new LettuceConnectionFactory(redisClusterConfig, clientConfiguration);

}

/**

* 配置第一个数据源的RedisTemplate

* 注意:这里指定使用名称=factory 的 RedisConnectionFactory

* 并且标识第一个数据源是默认数据源 @Primary

*

* @param redisConnectionFactory

* @return

*/

@Bean("redisTemplate")

@Primary

public RedisTemplate redisTemplate(@Qualifier("lettuceConnectionFactory") RedisConnectionFactory redisConnectionFactory) {

return getRedisTemplate(redisConnectionFactory);

}

/**

* 配置第二个数据源

*

* @return

*/

@Bean("secondaryRedisClusterConfig")

public RedisClusterConfiguration secondaryRedisConfig() {

Map source = new HashMap<>(8);

source.put("spring.redis.cluster.nodes", environment.getProperty("spring.secondaryRedis.cluster.nodes"));

RedisClusterConfiguration redisClusterConfiguration;

redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));

redisClusterConfiguration.setPassword(environment.getProperty("spring.redis.password"));

return redisClusterConfiguration;

}

@Bean("secondaryLettuceConnectionFactory")

public LettuceConnectionFactory secondaryLettuceConnectionFactory(GenericObjectPoolConfig redisPool, @Qualifier("secondaryRedisClusterConfig")RedisClusterConfiguration secondaryRedisClusterConfig) {

LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(redisPool).build();

return new LettuceConnectionFactory(secondaryRedisClusterConfig, clientConfiguration);

}

/**

* 配置第一个数据源的RedisTemplate

* 注意:这里指定使用名称=factory2 的 RedisConnectionFactory

*

* @param redisConnectionFactory

* @return

*/

@Bean("secondaryRedisTemplate")

public RedisTemplate secondaryRedisTemplate(@Qualifier("secondaryLettuceConnectionFactory") RedisConnectionFactory redisConnectionFactory) {

return getRedisTemplate(redisConnectionFactory);

}

private RedisTemplate getRedisTemplate(RedisConnectionFactory factory) {

RedisTemplate template = new RedisTemplate<>();

template.setConnectionFactory(factory);

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

// key采用String的序列化方式

template.setKeySerializer(stringRedisSerializer);

// hash的key也采用String的序列化方式

template.setHashKeySerializer(stringRedisSerializer);

// value序列化方式采用jackson

template.setValueSerializer(jackson2JsonRedisSerializer);

// hash的value序列化方式采用jackson

template.setHashValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

}

复制代码

java整合redis集群_SpringBoot2.X整合Redis(单机+集群+多数据源)-Lettuce版相关推荐

  1. Redis分片主从哨兵集群,原理详解,集群的配置安装,8大数据类型,springboot整合使用

    文章目录 Redis介绍 Redis分片 Redis主从 Redis哨兵 Redis集群 Redis持久化策略 RDB AOF 持久化方案选择 Redis内存策略 LRU算法 LFU算法 Random ...

  2. java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  3. 【15W字长文】主从复制高可用Redis集群,完整包含Redis所有知识点

    往期文章一览 分布式会话与单点登录SSO系统CAS,包含完整示例代码实现 [7W字长文]使用LVS+Keepalived实现Nginx高可用,一文搞懂Nginx 主从复制高可用Redis集群 分布式架 ...

  4. 安排,谷粒商城java分布式开发基础篇高级篇与高可用集群架构篇2020

    来源: 来自网络,如侵权请告知博主删除????. 仅学习使用,请勿用于其他- 最近有小伙伴管我要分布式这类的项目,还有一些要商城的,还有要springboot,springcloud,k8s等,几乎涵 ...

  5. 使用Redis缓存Shiro授权认证信息,搭建集群权限系统

    应用如果做负载均衡,集群间session需要共享,如果session没有共享,用户登录系统以后session保存在登录的应用里面,其他应用里面没有session,没有登陆状态,访问会失败.下面介绍一个 ...

  6. Redis学习(含 Springboot 整合 Redis)

    Redis NoSQL (not only sql) 在现代的计算系统上每天网络上都会产生庞大的数据量. 这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理. 1970年 E.F.Codd ...

  7. MongoDB和Java(4):Spring Data整合MongoDB(XML配置)

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  8. MongoDB和Java(5):Spring Data整合MongoDB(注解配置)

    最近花了一些时间学习了下MongoDB数据库,感觉还是比较全面系统的,涉及了软件安装.客户端操作.安全认证.副本集和分布式集群搭建,以及使用Spring Data连接MongoDB进行数据操作,收获很 ...

  9. docker部署redis集群_Docker部署Redis集群----第九节(docker-redis哨兵集群“轮询分流”篇实例一)...

    到此,我们的 Redis 哨兵集群就结束了,本篇章是第九篇章,也是使用集群方式的实例一来实现php的轮询分流. 1.准备工作: 在我们上一篇章实现redis 哨兵集群的基础上开始,在服务器上部署php ...

最新文章

  1. 如何在数字前面填充0,在股票代码前面补上0的三种方法
  2. 汇编中的BP与SS组合时,BP里面放的到底是SS中的一个基地址的指针还是基地址本身?
  3. 2010年基于Linux的10大技术趋势
  4. 企业级监控工具Cacti安装配置全过程
  5. SAP gateway 后台系统的 OData service 服务探测机制实现原理
  6. HEVC 编解码资源
  7. LeetCode 1770. 执行乘法运算的最大分数(DP)
  8. python mysql返回,python操作mysql数据-执行语句返回值直接返回字典类型
  9. 人力资源社会保障部关于公布国家职业资格目录的通知
  10. vue 查看变量类型_Vue学习 开始走向VUE开发2---插值使用详解
  11. cad在线转换低版本_别再傻瓜式操作了,工作效率上不去?这6个小技巧带你玩转CAD...
  12. Java web切面编程
  13. TCP/IP常见英文缩写
  14. JAVA知识体系之分布式篇(四)——Kafka
  15. python安装后桌面没有显示图标_Win10安装软件后找不到软件图标如何解决
  16. 360极速浏览器无法打开qq邮箱网址
  17. system-config-network
  18. 为何学习Python?这是我看到的最好回答
  19. Android---MVC/MVP/MVVM的演进
  20. ufs2.2 协议扫盲(三)

热门文章

  1. 基于TPS28225功率MOS半桥电路测试
  2. DG1062可编程信号源
  3. 关于eclipse的maven
  4. java中正则表达式 ?=_Java中的正则表达式
  5. java 取不同的随机数_Java实现获取指定个数的不同随机数
  6. 柱坐标系下的ns方程_笛卡尔坐标系到底是什么?
  7. android动态创建arraylist,Android:二维ArrayList帮助
  8. python有哪些软件包用来考察变量之间的相关性_Python计算数据相关系数(person、Kendall、spearman)...
  9. Oral English 1: A topic about public transportaion in Chicago.
  10. HDLBits 系列(37)此系列关于独热码的题目的疑问?