前端时间新项目使用SpringBoot的RedisTemplate遇到一个问题,先简单描述一下问题:不同项目之间redis共用一个,但是我们新项目读不到老项目存储的缓存。新项目搭建的时候没有跟老项目使用同一个core包里的redisutils工具类,老项目使用的是jedis对象来操作redis,新项目使用了springboot封装的redistemplate,代码上存在差异所以出现问题也就很正常,先来看一下新项目里对redistemplate的使用:(截取一个方法为例)

  现象:

  

  可以看出来工具直接注入spring容器中的redistemplate,没有指定泛型,在使用的时候通过key的泛型使用的是Serializable,value的泛型是value,从泛型能看出来key跟泛型有一定关系,下面就来验证一下为什么取不到值。我们先往redis里存储一个缓存以字符串为例:

  

   写一个junit测试 

  

  测试取缓存

  

  通过结果发现没有取到值,反过来通过测试方法存一下缓存,再看我们存的是一个什么值

  

  通过结果发现我们存进去的key是redistemplate-test,但是redis实际存进去的key却是\xac\xed\x00\x05t\x00\x12redistemplate-test,同理,我们取缓存的时候前面也会自动加上一串看不懂的东西,所以取值的时候肯定也取不出来。做项目的时候时间比较紧,用了其他同事的代码保证项目上线,上线后才回过头去看取不到值的原因,其实同事的代码也很简单,只是在使用redistemplate的时候指定了泛型为string,就可以取到值了,其实也可以使用StringRedisTemplate来操作,但是StringRedisTemplate主要用来存储字符串,它的泛型指定的是String。如果存入对象时,会报错 :can not cast into String,所以我们就继续修改这个工具,解决key值前面的字符串。

   原因:

  下面我们简单的看一下redistemplate源码

  

  opsForValue方法会返回一个ValueOperations<K, V>,k跟v就是泛型,我们就是通过valueOps来get,set我们的值。这个方法会new一个DefaultValueOperations对象,传入的template就是当前RedisTemplate对象,向下看:

  有很多个RedisSerializer,默认都是null,当调用opsForValue方法时会传入当前redistemplate对象,以keySerializer为例,它默认为null,如果等于null就被赋值dafaultSerializer,默认dafaultSerializer也为空,最终keySerializer就被赋值为JdkSerializationRedisSerializer,所以没有设置序列化方式的时候redistemplate使用的序列化方式为JdkSerializationRedisSerializer,所以我们存入key前面会带上一串东西,而StringRedisTemplate使用的是 StringRedisSerializer,序列化的方式不一样,所以使用的时候key就不会出现一串字符串。

  解决方案:

  简单了解原因后,现在就来解决这个问题,解决问题的方法就是设置序列化方式

  

  这样解决了上面的问题。问题倒不难,只是自己以前没有遇到过,不知道这个方法是同事从网上直接复制的还是同事自己写的,只能说复制的时候不够严谨,没有考虑到项目的实际情况,这个问题其实只要拿出一块时间去看看代码,查查资料就能解决,所以遇到问题的时候一定要找到原因去解决问题,而不是把问题隐藏掉。

  

SpringBoot项目使用RedisTemplate设置序列化方式的更多相关文章

  1. 项目中redisTemplate设置的key,redis客户端上查询不到的问题

    再项目使用了redis储存key,测试需要在客户端删除对应的key,发现查询不到对应的key redis客户端: 发现redisTemplate实际存进去的key会多了几个字符 原因:程序中对key没 ...

  2. SpringBoot项目的几种创建方式,启动、和访问

    最常用的4种方式,但除了这些以外,还有其他方式: ①在线创建 ②STS构建 ③Intell  Idea内置构建工具 ④Maven创建 STS官网:https://start.spring.io  .S ...

  3. IDEA+SpringBoot项目启动参数设置

    SpringBoot属性加载顺序 顺序 形式 1 在命令行中传入的参数 2 SPRING_APPLICATION_JSON中的属性.SPRING_APPLICATION_JSON是以JSON的格式配置 ...

  4. java -jar 运行springboot项目时内存设置

    java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX ...

  5. springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other)

    方法1: application.yml mybatis-plus: configuration: jdbc-type-for-null: 'null' #注意:单引号 方法2: 查看mp-start ...

  6. gradle springboot 项目运行的三种方式

    一.java -jar 二.eclipse中 Java Application 三.命令行 gradle bootRun

  7. redis-springboot-redistemplate更改序列化方式

    redisTemplate 默认的序列化方式为 jdkSerializeable, StringRedisTemplate的默认序列化方式为StringRedisSerializer 可以通过手动配置 ...

  8. 使用maven构建项目时,SSM和springboot项目的打包与云服务器部署

    下面讲讲如何打包SSM和springboot项目,并部署到云服务器上. 由于使用的IDE不同,有的使用eclipse,有的使用idea,所以如果在IDE中按照 maven clean 再 maven ...

  9. springboot项目基础面试题

    1.springboot与spring的区别. 引用自官方说法: java在集成spring等框架需要作出大量的配置,开发效率低,繁琐.所以官方提出 spring boot的核心思想:习惯优于配置.可 ...

随机推荐

  1. go 学习 (四):接口 & 方法

     接口声明 // 接口声明 语法:接口是一个 函数签名 的集合,函数签名(函数的声明,不包括实现) type interfaceName interface { method1(param param ...

  2. 洛谷 P1908 逆序对 题解

    每日一题 day43 打卡 Analysis 因为数据规模,所以我们需要对其进行离散化,新创一个数组a里面来放在我们的初始序列中在这个位置上的数是第几大的这里还要用一个小技巧排序,关于离散化的技巧我们 ...

  3. zabbix值显示的问题

    虽然在创建监控项的时候,是可以选值类型的,目前有的是整型,浮点型,日志,文本,字符串.但是不要误认为zabbix采集数据的时候就是按照这个格式采集的. zabbix各种接口采集到的数据都是字符串类型, ...

  4. 使用RedisDesktopManager客户端无法连接Redis服务器问题解决办法

    是否遇到安装完成后连不上的问题? 那么这篇教程能解决. 执行步骤: 1.修改redis文件夹下redis.cong文件,在bind 127.0.0.1行前面加#注释掉这一行,使能远程连接(默认只能使用 ...

  5. MySQL explain使用

    1.介绍 EXPLAIN 命令用于SQL语句的查询执行计划.这条命令的输出结果能够让我们了解MySQL 优化器(optimlzer)是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提 ...

  6. Net core学习系列(三)——Net Core中的依赖注入

    本文通过一个维修工与工具库的例子形象的描述一下为什么要用依赖注入.它的工作原理是什么样的, 然后根据这个类比一下ASP.NET Core 中的依赖注入, 从而深刻了解它的使用方法.注意事项以及回收机制 ...

  7. centos7 docker swarm加入集群失败

    提示的错误为 [root@localhost downloads]# docker swarm join --token SWMTKN-1-2ezr0k5ybds1la4vgi2z7j8ykxkmm0 ...

  8. django后台list_display中添加自定义字段

    list_display = ("apply_prove",) def apply_prove(self, obj): : return "<a href='/' ...

  9. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

  10. pycharm安装pyinstaller将pygame打包成exe

    首先,使用pycharm自带的下载包工具,File-Settings-Project Interpreter,如图: 安装完成后,发现安装到了Python根目录下,我的在C:\python34\Scr ...