在redis中使用命令行插入一条数据:
在springboot项目中使用redisTemplate查询name却显示null
原因分析
redisTemplate在执行查询操作时会使用默认的序列化方式对查询的key进行序列化,那么在reids中查询的key已经不是“name”了。
验证:使用redisTemplate插入一条key为nickName的数据
@Test
public void test02(){
ValueOperations ops = redisTemplate.opsForValue();
ops.set("nickName" , "张三");
}
使用keys * 查看redis
发现插入的“nickName”已经被格式化了
解决方法一:使用StringRedisTemplate
redisTemplate 与StringRedisTemplate 区别
区别主要在于他们使用的序列化类。
RedisTemplate使用的是 JdkSerializationRedisSerializer
StringRedisTemplate使用的是 StringRedisSerializer
StringRedisTemplate 继承了RedisTemplate,在构造器中,直接设置了序列化方式
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
而使用RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组。然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示
RedisTemplate就无法获取导数据,这个时候获取到的值就是NULL
当Redis当中的数据值是以可读的形式显示出来的时候,只能使用StringRedisTemplate才能获取到里面的数据。所以当你使用RedisTemplate获取不到数据的时候请检查一下是不是Redis里面的数据是可读形式而非字节数组。
参考:RedisTemplate查询不到redis中的数据问题解决
解决方法二:使用RedisConfig模板指定序列化方案
key用StringRedisSerializer
value用Jackson2JsonRedisSerializer
pom导入jjwt依赖
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
/****
* 序列化设置
*/
@Bean("redisTemplate")
public RedisTemplate getRedisTemplate(RedisConnectionFactory redissonConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redissonConnectionFactory);
redisTemplate.setValueSerializer(valueSerializer());
redisTemplate.setKeySerializer(keySerializer());
redisTemplate.setHashKeySerializer(keySerializer());
redisTemplate.setHashValueSerializer(valueSerializer());
return redisTemplate;
}
@Bean
public StringRedisSerializer keySerializer() {
return new StringRedisSerializer();
}
@Bean
public RedisSerializer valueSerializer() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
return jackson2JsonRedisSerializer;
}
}