Redis的可视化工具查询内容为 --> “\xac\xed\x00\x05t\x00”乱码
简要描述从以下几点说明:RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。.RedisTemplate是spring对Redis的封装, StringRedisTemplate继承RedisTemplate。//
Redis的可视化工具查询内容为 --> “\xac\xed\x00\x05t\x00”乱码
1.简要描述
从以下几点说明:
- RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
- StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
- .RedisTemplate是spring对Redis的封装, StringRedisTemplate继承RedisTemplate。
//部分代码:
@Component
public class RedisUtils {
@Resource
private RedisTemplate<String, Object> redisTemplate;
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { //默认是JdkSerializationRedisSerializer this.redisTemplate = redisTemplate;
}
}
使用RedisTemplate操作redis数据,在相关的redis可视化工具中查看数据,如下图!虽然可视化工具显示如此,但不影响读写
2.问题描述
用Spring data 的RedisTemplate查询一个hash,输入正确的key,却不能查出来数据,使用命令keys *查询了下发现存入的值变乱码了
改进过程,实例化RedisTemplate时使用StringRedisSerializer(String序列化策略), 但是注意一点,由于采用了String的序列化策略,所以只接受value值类型为String的参数。
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;
}
}
转换后可能遇到的问题
Error:(22, 58) java: 无法访问com.fasterxml.jackson.databind.JavaType 找不到com.fasterxml.jackson.databind
解决方式
<!-- pom.xml文件-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.8.6</version>
</dependency>
此时存储的值,如下图!
3.采用String序列化时遇到的问题
在使用RedisTemplate默认的序列化JdkSerializationRedisSerializer (JDK的序列化策略),如果存储的是对象,可以直接转换接收
//原本接收时
Student student = (Student) redisUtils.hashGet(RedisKeys.KEY_STUDENTE,String.valueOf(studentId));
当改成StringRedisSerializer(String序列化策略),接收值为LinkedHashMap不能转换成对象,这是需要对接收后的Map进行转换
//现在接收时
Map<String,Object> stringMap = (HashMap<String, Object>) redisUtils.hashGet(RedisKeys.KEY_STUDENT,String.valueOf(studentId));
System.out.println("stringMap=======================>" + stringMap);
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(stringMap));
System.out.println("JSON.toJSONString(stringMap)==============>"+JSON.toJSONString(stringMap));
System.out.println("jsonObject=====================>"+jsonObject);
Student student1 = jsonObject.toJavaObject(Student.class);
System.out.println("Student1=====================>"+student1);
//输出的返回值
stringMap================================>
{studentId=65, studentName=林云, sex=2, studentAge=null, createTime=1623754421000, updateTime=1625204632000}
JSON.toJSONString(stringMap)==============>
{"studentId":65,"studentName":"林云","sex":2,"createTime":1623754421000,"updateTime":1625204632000}
jsonObject================================>
{"studentId":65,"createTime":1623754421000,"phone":"15705542518","studentName":"林云","sex":2,"updateTime":16252046320000}
moleStudent1==============================>
MoleStudent(studentId=65, studentName=林云, sex=2, studentAge=null, createTime=Tue Jun 15 18:53:41 CST 2021, updateTime=Fri Jul 02 13:43:52 CST 2021)
4.解决问题时参考链接
[1] https://blog.csdn.net/u011345756/article/details/83861186
[2] https://www.jianshu.com/p/fa2e5d16b0c4
[3] https://blog.csdn.net/MaYuYan1/article/details/109489150
更多推荐
所有评论(0)