spring-data-redis 使用过程中需要注意的一点(序列化选择)

在项目中需要用到redis做缓存,于是采用spring-data-redis,并且打算自己封装一个redis的静态工具类。后来在进行单元测试的过程中发现了一个容易出错的地方,于是打算记录下来,并分享给各位朋友。

这里主要说下碰到的问题,首先,采用了spring-data-redis(以下简称SDR)中的Template进行redis的操作。

因为考虑到后期的使用场景,于是同时采用了StringRedisTemplate和RedisTemplate,并且对存储String与存储Java对象采用不同的Template进行了简单的封装。

首先是测试 保存与取出方法。分别用不同的template可以完美通过。

然后在测试删除的方法中,测试出现了问题。

问题如下:

在采用StringRedisTemplate进行保存的数据,用StringRedisTemplate去删除可以成功删除。

在采用RedisTemplate进行保存的数据,用RedisTemplate去删除也可以删除成功。

在用RedisTemplate去删除StringRedisTemplate保存的数据时,发现删除失败。

在用StringRedisTemplate去删除RedisTemplate保存的数据时,删除失败。

因为,需要封装一套通用的删除方法,并且需要封装一个批量删除的方法。所以研究了下问题出现的原因。

经过查看SDR官方给出的文档,发现是因为序列化策略的问题。

这里简单说下:

SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。StringRedisSerializer

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。JdkSerializationRedisSerializer

就是因为序列化策略的不同,即使是同一个key用不同的Template去序列化,结果是不同的。所以根据key去删除数据的时候就出现了删除失败的问题。

解决方法如下,手动指定RedisTemplate的key的序列化策略

[xml]view plaincopyprint?

  

  

  

class="org.springframework.data.redis.serializer.StringRedisSerializer" />  


  

  

  

  

  

    class="org.springframework.data.redis.serializer.StringRedisSerializer" />

    

    

    

这样就能完美的删除了。

这里推荐将所有Template的key都采用String的序列化方式,而value的序列化方式可以采用不同的序列化方式。(jreids自动选择)(这样还有一个好处就是不必string的也采用jdk的序列化从而导常用数据格式致为了存储数据结构浪费空间)

另外 出来这两个序列化方式之外,SDR还提供了  

JacksonJsonRedisSerializer

Jackson2JsonRedisSerializer

OxmSerializer

等序列化方法,大家可以分别采用各种序列化方式做一些试验。

如果你想学好JAVA这门技术,也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,8个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,q群号为:180705916 进群免费领取学习资料。

你可能感兴趣的:(spring-data-redis 使用过程中需要注意的一点(序列化选择))