原因分析

原因与RedisTemplate源码中的默认序列化方式有关

  1. defaultSerializer = new JdkSerializationRedisSerializer(
  2. classLoader != null ? classLoader : this.getClass().getClassLoader());`

默认序列化使用的是JdkSerializationRedisSerializer,我们进去看看

  1. public JdkSerializationRedisSerializer(ClassLoader classLoader) {
  2. this(new SerializingConverter(), new DeserializingConverter(classLoader));
  3. }

可以看到这里使用了SerializingConverter对象,再进去看看,

这里的convert方法就是这个对象传入JdkSerializationRedisSerializer后会被调用的方法

  1. public byte[] convert(Object source) {
  2. ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024);
  3. try {
  4. this.serializer.serialize(source, byteStream);
  5. return byteStream.toByteArray();
  6. } catch (Throwable var4) {
  7. throw new SerializationFailedException("Failed to serialize object using " + this.serializer.getClass().getSimpleName(), var4);
  8. }
  9. }

可以看出来这里使用普通的serializer的serialize方法,并没有什么特别的

但是问题就在于,这里的source是Object对象,

JdkSerializationRedisSerializer把传入的值当Object对象进行序列化,所以可以猜测这里key出现的\xac\xed\x00\x05t\x00\tb其实可能是对象头信息。


解决方案

我们可以使用下面这种方法设置其他序列化方式,这样就不会出现问题:

  1. redisTemplate.setKeySerializer(new StringRedisSerializer());
  2. redisTemplate.setValueSerializer(new StringRedisSerializer());
  3. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  4. redisTemplate.setHashValueSerializer(new StringRedisSerializer());

但是这种方法明显很不优雅,所以我们应该直接使用StringRedisTemplate类来解决问题:

  1. @Autowired
  2. private StringRedisTemplate stringRedisTemplate;

它帮我们进行了设置序列化方式的封装,我们可以看看它的构造方法:

  1. public StringRedisTemplate() {
  2. RedisSerializer<String> stringSerializer = new StringRedisSerializer();
  3. setKeySerializer(stringSerializer);
  4. setValueSerializer(stringSerializer);
  5. setHashKeySerializer(stringSerializer);
  6. setHashValueSerializer(stringSerializer);
  7. }

当然也可以使用配置的方式设置序列化方法,不过这里就不作出说明了。

SpringBoot使用RedisTemplate操作Redis时,key值出现 \xac\xed\x00\x05t\x00\tb的更多相关文章

  1. Spring Data操作Redis时,发现key值出现 \xac\xed\x00\x05t\x00\tb

    原文链接:http://blog.csdn.net/yunhaibin/article/details/9001198 最近在研究redis,以及spring data对redis的支持发现了一个奇怪 ...

  2. SpringBoot 使用RedisTemplate操作Redis

    新版: import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.T ...

  3. 【redis】java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用

    java操作redis时,StringRedisTemplate的expire()方法的作用,什么时候使用 //重新设置过期时间为30分钟,刷新时间 redisTemplate.expire(MsOp ...

  4. redis key/value 出现\xAC\xED\x00\x05t\x00\x05

    1.问题现象: 最近使用spring-data-redis 和jedis 操作redis时发现存储在redis中的key不是程序中设置的string值,前面还多出了许多类似\xac\xed\x00\x ...

  5. 解决Spring Boot 使用RedisTemplate 存储键值出现乱码 \xac\xed\x00\x05t\x00

    spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化解决方法 ...

  6. 使用redisTemplate存储数据,出现\xAC\xED\x00\x05t\x00

    本文开发环境:SpringBoot+RedisTemplate 代码: /** * 缓存Map * * @param key * @param dataMap * @return */ @Overri ...

  7. springboot中,使用redisTemplate操作redis

    知识点: springboot中整合redis springboot中redisTemplate的使用 redis存数据时,key出现乱码问题 一:springboot中整合redis (1)pom. ...

  8. Java 使用Jedis和RedisTemplate操作Redis缓存(SpringBoot)

    package com.example.redis.controller; import com.example.redis.entity.User; import com.example.redis ...

  9. Spring中使用RedisTemplate操作Redis(spring-data-redis)

    RedisTemplate如何检查一个key是否存在? return getRedisTemplate().hasKey(key); 由一个问题,复习了一下redis 抄自: https://www. ...

随机推荐

  1. Slog27_支配vue框架初阶项目之博客网站-样式居中

    ArthurSlog SLog-27 Year·1 Guangzhou·China July 30th 2018 GitHub 掘金主页 简书主页 segmentfault 没有写够足够的代码量,想成 ...

  2. C++泛化双向链表

    泛型双向链表 双向链表(doublyLinkedList.h) /******************************************************************* ...

  3. 2020 webstorm 最新激活方式 有效期2021年11月 可用

    MIIElT25XE-eyJsaWNlbnNlSWQiOiJPUVQzT0oyNVhFIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IGlkZWEubWVkZW1pb ...

  4. c++第二周阶段小测2

    函数参数已完成(全部是正确答案)     1 [单选题] 以下关于函数参数的说法,不正确的是   A. 函数调用时,先将实参的值按照位置传递给对应的形参. B. 实参与形参的个数及顺序不必一一对应. ...

  5. Simulink仿真入门到精通(十八) TLC语言

    TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...

  6. 《前端之路》- TypeScript(二) 函数篇

    目录 一.定义函数方法 二.定义函数传参 三.可选传参 四.默认传参 五.传递剩余参数 六.函数重载 七.箭头函数 八.总结 一.定义函数方法 在 es5 中定时函数的方法有 命名函数和函数表达式(匿 ...

  7. Java 基础(四):数组

    数组,一种应用非常广泛的数据结构,简单地来说就是一组类型相同且无序的元素的存储在固定长度且有序的内存空间. 创建一个数组 在Java中,我们可以通过[]去声明一个指定类型的数组 int[] a; // ...

  8. 简说Python之flask-SQLAlchmey的web应用

    目录 原生语句操作MySQL数据库 1.安装MySQL 2.MySQL设置用户和权限 3.用PyMySQL操纵MySQL数据库 4. CRUD增,删,改,查 使用SQLAlchemy 1.安装SQLA ...

  9. mysql那些事之索引篇

    mysql那些事之索引篇 上一篇博客已经简单从广的方面介绍了一下mysql整体架构以及物理结构的内容. 本篇博客的内容是mysql的索引,索引无论是在面试还是我们日常工作中都是非常的重要一环. 索引是 ...

  10. ajax上传文件,通过FromData把数据传给后端

    前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...