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:

 

posted @ 2020-12-05 11:53  vijayxu  阅读(1437)  评论(0编辑  收藏  举报