为什么重写 redisTemplate
1.安装 redis
- 上传 redis 的安装包
tar -xvf redis-5.0.7.tar.gz
yum -y install gcc-c++
make
make PREFIX=/soft/redis install
cd /soft/redis/bin
./redis-server redis.conf
2. 集成 redisTemplate
maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.2</version>
</dependency>
<!-- redis 连接池要用到的包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
<!--注解方式-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.5</version>
</dependency>
<!--ObjectMapper-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.4</version>
</dependency>
Controller 代码
@RestController
public class TestController {
@Resource
private RedisTemplate redisTemplate;
@GetMapping("/testRedis")
public void testRedis() {
redisTemplate.opsForValue().set("name", "jichi");
}
}
application.yaml 配置文件
spring:
redis:
host: localhost
port: 6379
password: password
database: 0
# 指定 redis 连接池,有两种:1.lettuce 2.jedis
lettuce:
pool:
# 最大连接数
max-active: 20
# 最大空闲连接数
max-idle: 8
# 最大等待时间,单位 ms,-1 表示永远等待
max-wait: -1
# 最小空闲
min-idle: 0
如果启动过程中发生如下 Bug,说明我们 redis 连接池的配置没有在 maven 依赖中导入 apache.commons.pool2 的包
Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig
程序成功启动之后,我们访问 /testRedis 接口再去 Redis 可视化客户端查看刚添加的数据发现是乱码:
这个乱码就是由于我们 RedisTemplate 默认使用 Jdk 序列化造成的,如果我们想要可视化更好一些我们可以自己封装配置一个。
@Configuration
public class RedisConfig {
// 帮助我们序列化属性,我们怎么做序列化,我们对什么属性做操作
@Resource
private ObjectMapper objectMapper;
/**
* redis 的 key 都是 String,但是它的 value 可能有各种各样的东西
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// String 序列化
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
// 连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 普通 key(String) 序列化规则配置
redisTemplate.setKeySerializer(redisSerializer);
// hash key(String) 序列化规则配置
redisTemplate.setHashKeySerializer(redisSerializer);
// 重点:value 的序列化
// value 是对象-->要配置 jackson 进行配置
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
return redisTemplate;
}
/**
* 自定义序列化器
* 实现自己的 Jackson 的序列化器
*/
private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
// 因为我们要序列化的是 Object 所以我们整一个 Object.class 作为参数
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
// 我们对哪些属性做序列化
// PropertyAccessor.ALL 所有方法都进行序列化
// JsonAutoDetect.Visibility.ANY 告知序列化范围,ALL 下的 ANY 任何东西都要给它序列化
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 设置序列化报错:可能存在序列化时字符串和属性对不上,它可能找不到,可以用下面规避一下报错
// DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 找不到属性的时候禁用报错,参数2:设置是否开启,直接给它 false 禁用掉
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
}
}
然后重启项目再进行访问 /testRedis,查看 Redis 客户端: