1.简单描述
- RedisTemplate是spring对Redis的封装, StringRedisTemplate 继承 RedisTemplate
- StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
- RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
一般代码是
@Component
public class RedisUtils {
@Resource
private RedisTemplate<String, Object> redisTemplate;
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { //默认JdkSerializationRedisSerializer
this.redisTemplate = redisTemplate;
}
}
可视化工具查看是如下
2.问题描述与解决
如上,查看时乱码。
在用Spring data 的RedisTemplate查询一个hash,输入正确的key,却不能查出来数据。
于是尝试往redis里存一个简单的KV键值对,redis客户端get key发现找不到key。
使用命令keys *查询了下发现存入的值变乱码了。
这时候我们需要修改RedisTemplate的序列化策略。 但是注意一点,由于采用了String的序列化策略,所以只接受value值类型为String的参数。
//key序列化方式改成StringRedisSerializer
//value序列化方式改为Jackson2JsonRedisSerializer
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtils {
@Resource
private RedisTemplate<String, Object> redisTemplate;
//public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
// this.redisTemplate = redisTemplate;
//}
//表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer(); //序列化为String
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //序列化为Json
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
this.redisTemplate = redisTemplate;
}
}
此时可视化工具如下
相关链接
https://blog.csdn.net/weixin_45941687/article/details/121203342
【RedisTemplate序列化方式转换】