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: