为什么重写 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 {@Resourceprivate RedisTemplate redisTemplate;@GetMapping("/testRedis")public void testRedis() {redisTemplate.opsForValue().set("name", "jichi");}
}
application.yaml 配置文件
spring: redis:host: localhostport: 6379password: passworddatabase: 0# 指定 redis 连接池,有两种:1.lettuce 2.jedislettuce: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 {// 帮助我们序列化属性,我们怎么做序列化,我们对什么属性做操作@Resourceprivate ObjectMapper objectMapper;/*** redis 的 key 都是 String,但是它的 value 可能有各种各样的东西*/@Beanpublic 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 客户端: