-
第五章 新版SpringBoot2.x整合Redis6客户端实战
第1集 分布式缓存Redis客户端讲解
简介:分布式缓存Redis客户端讲解
-
自带客户端 redis-cli
-
可视化工具
-
语言客户端:java、nodejs、python
-
java语言客户端:
- jedis
Jedis 是直连模式,在多个线程间共享一个 Jedis 实例时是线程不安全的,需要使用连接池
其API提供了比较全面的Redis命令的支持,相比于其他Redis 封装框架更加原生
Jedis中的方法调用是比较底层的暴露的Redis的API,Java方法基本和Redis的API保持着一致
使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,不支持异步操作
- lettuce
高级Redis客户端,用于线程安全同步,异步响应
基于Netty的的事件驱动,可以在多个线程间并发访问, 通过异步的方式可以更好的利用系统资源
-
第2集 新版SpringBoot2.X项目创建
简介:新版SpringBoot2.X项目创建
-
新版SpringBoot2.X介绍
- 官网:https://spring.io/projects/spring-boot
- GitHub地址:https://github.com/spring-projects/spring-boot
- 官方文档:https://spring.io/guides/gs/spring-boot/
- 视频地址:https://item.taobao.com/item.htm?id=618384570391
-
相关软件环境和作用
-
JDK1.8+以上
-
Maven3.5+
-
编辑器IDEA(旗舰版)
-
PostMan
-
翻译神器
- https://translate.google.cn/
-
-
在线创建 :https://start.spring.io/
-
注意:
-
采用springboot2.5 + jdk11
-
初次导入项目下载包比较慢 5~20分钟不等
- 出问题的话: mvn clean install 试试
-
不建议修改默认maven仓库(可以先还原默认的,防止下载包失败)
-
idea记得配置jdk11
-
-
第3集SpringBoot2.x实战整合Redis客户端+单元测试
简介:SpringBoot2.x整合Redis客户端+单元测试
-
在SpringBoot整合Redis很简单
-
SpringData介绍
- 操作mysql/redis/elasticseatch
- SpringDataRedis是专门操作redis的依赖
-
添加依赖 spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
-
-
注意
-
Springboot2后默认使用Lettuce作为访问redis的客户端
-
旧版本lettuce存在堆外内存溢出的bug, 5.3版本修复了这个bug, 我们是用 6.1
-
很多同学没产生原因
- 并发量不高
- 内存足够大,没发生问题就又发布更新了
-
解决方式
- 升级版本
- 换jedis
-
第4集 SpringDataRedis的RedisTemplate讲解介绍
简介:SpringDataRedis配置RedisTemplate介绍
-
RedisTemplate介绍
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:list类型的数据操作
-
RedisTemplate和StringRedisTemplate的区别
-
StringRedisTemplate继承RedisTemplate
-
两者的数据是不共通的(默认的序列化机制导致key不一样)
-
StringRedisTemplate默认采用的是String的序列化策略
-
RedisTemplate默认采用的是JDK的序列化策略,会将数据先序列化成字节数组然后在存入Redis数据库
-
总结
- 当redis数据库里面本来操作的是字符串数据的时候,那使用StringRedisTemplate即可
- 数据是复杂的对象类型,那么使用RedisTemplate是更好的选择
-
-
操作
-
String结构
- 存储字符串
- 存储对象
-
第5集 RedisTemplate的序列和反序列化机制讲解
简介:RedisTemplate的序列和反序列化机制讲解
-
上集问题
- 同个key为啥获取不到值,核心就是序列化机制导致key不一样
-
什么是序列化
-
把对象转换为字节序列的过程称为对象的序列化。
-
把字节序列恢复为对象的过程称为对象的反序列化。
-
对象的序列化主要有两种用途
- 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中
- 在网络上传送对象的字节序列。
-
-
Redis为什么要序列化
-
性能可以提高,不同的序列化方式性能不一样
-
可视化工具更好查看
- 采用默认的jdk方式会乱码(POJO类需要实现Serializable接口)
- 采用JSON方式则不用,且可视化工具更好查看
-
-
自定义redis序列化方式,提供了多种可选择策略
-
JdkSerializationRedisSerializer
- POJO对象的存取场景,使用JDK本身序列化机制
- 默认机制 ObjectInputStream/ObjectOutputStream进行序列化操作
-
StringRedisSerializer
- Key或者value为字符串
-
Jackson2JsonRedisSerializer
- 利用jackson-json工具,将pojo实例序列化成json格式存储
-
GenericFastJsonRedisSerializer
- 另一种javabean与json之间的转换,同时也需要指定Class类型
-
...
-
第6集 RedisTemplate 序列化机制配置实战
简介:自定义序列化和反序列化机制配置实战
- 配置实战
@Configuration
public class RedisTemplateConfiguration {
/**
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置key和value的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置hashKey和hashValue的序列化规则
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
// 设置支持事物
//redisTemplate.setEnableTransactionSupport(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
第7集 SpringBoot整合Jedis+Lettuce客户端连接池配置实战
简介:SpringBoot整合Jedis+Lettuce客户端连接池配置实战
-
基于SpringDataRedis可以快速替换底层实现
- Lettuce连接池介绍(添加连接池)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active = 10
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle = 10
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle = 0
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait= -1ms
#指定客户端
spring.redis.client-type = lettuce
- Jedis连接池介绍(可以不排除lettuce依赖包)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--不用指定版本号,本身spring-data-redis里面有-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.1</version>
</dependency>
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active = 10
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle = 10
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle = 0
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait= -1ms
#指定客户端
spring.redis.client-type = jedis
-
断点调试 redisTemplate的connectionFactory实现
来源:https://www.cnblogs.com/Xd17324217006/p/14894864.html