RedisTemplate配置序列化器无效
Redis是一种运行在内存的数据库,运行速度很快,1s内可完成10万次的读写,性能十分高效,在现今的互联网应用中使用很广泛。常见的场景是做热点数据的缓存、分布式缓存、分布式锁.....,Spring也对Redis进行了集成,设置了RedisTemplate这个强大的类,用来操作redis。
配置RedisTemplate也非常的简单,直接上代码
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory connectionFactory;
@Bean
public RedisTemplate<String,Object> initRedisTemplate(){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
//配置序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
这里配置了序列化器,Redis是基于字符串存储的NoSQL,而java是基于对象的语言,对象是无法存储到Redis中的,不过java提供了序列化机制,只要类实现了Java.io.Serializable接口,就代表类的对象能够进行序列化,通过将类对象进行序列化就能够得到二进制字符串,这样Redis就可以将这些类对象以字符串进行存储,像这样的

RedisTemplate默认使用的是JdkSerializationRedisSerializer系列化器,上图这字符串就是被它序列化的字符串,这样的字符串不利于我们追踪,给查询Redis数据带来了很大的困难,为了使Redis的键以普通字符串保存,我们需要配置字符串序列化器StringSericalizer,这里我将Redis的键和散列结构的field和value采用了字符串序列化器。接下来我们就直接使用了。
@RestController
public class UserController {
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping(value = "/getUser")
public String getUser(){
redisTemplate.opsForValue().set("huahua","cenyu");
String value = (String) redisTemplate.opsForValue().get("huahua");
System.out.println(redisTemplate.getKeySerializer());
return value;
}
}
请求访问后,我们查了redis库,我们发现key依然保存的是一个复杂的字符串,而打印的序列化器也依然是默认的序列化,这是怎么回事呢?


于是我把我配置的RedisTemplate以及控制层自动注入的RedisTemplate对象打印出来,发现两个都不是同一个对象


这就难怪了对象都不是同一个,也难怪会配置了没反应。
解决方案1:

解决方案2:


浙公网安备 33010602011771号