spring-data-redis 使用过程中需要注意的一点(序列化选择)
来源:互联网 发布:软件测试绩效考核指标 编辑:程序博客网 时间:2024/05/22 01:57
在项目中需要用到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的序列化策略
<!-- redis 序列化策略 ,通常情况下key值采用String序列化策略, --><!-- 如果不指定序列化策略,StringRedisTemplate的key和value都将采用String序列化策略; --><!-- 但是RedisTemplate的key和value都将采用JDK序列化 这样就会出现采用不同template保存的数据不能用同一个template删除的问题 --><bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" /><bean id='redisWriteTemplate' class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="jedisWriteConnectionFactory" /> <property name="keySerializer" ref="stringRedisSerializer" /> <property name="hashKeySerializer" ref="stringRedisSerializer" /></bean>
这样就能完美的删除了。
这里推荐将所有Template的key都采用String的序列化方式,而value的序列化方式可以采用不同的序列化方式。(jreids自动选择)(这样还有一个好处就是不必string的也采用jdk的序列化从而导常用数据格式致为了存储数据结构浪费空间)
另外 出来这两个序列化方式之外,SDR还提供了
JacksonJsonRedisSerializerJackson2JsonRedisSerializerOxmSerializer
等序列化方法,大家可以分别采用各种序列化方式做一些试验。
- spring-data-redis 使用过程中需要注意的一点(序列化选择)
- Redis 使用spring-data-redis的序列化问题
- 使用kryo作为spring data redis的序列化器
- (转)SqlHelper 使用中需要注意的一点(带输出、返回参数的存储过程)
- spring-data-redis 的序列化问题
- Spring Data redis序列化的比较
- Spring 整合redis集群 实现 以及过程中需要注意的问题点
- Spring中spring-data-redis的使用
- Spring使用中需要注意的地方
- 安装redis过程中需要注意的问题
- 新手选择Linux VPS过程中需要注意的几个问题
- spring-data-redis使用自定义序列化数据 使用 protobuf
- STRUTS2 中使用事物需要注意的一点
- QT中使用控制台和Application需要注意的一点
- spring-data-redis使用jdk序列化时increment的异常
- php中in_array需要注意的一点
- PHP 中 in_array 需要注意的一点
- 使用 FancyUpload需要注意的一点
- CSS伪类选择器
- NOIP 2006 提高组 复赛 budget 金明的预算方案
- TCP协议下的客户机和服务器模型
- Semaphore-信号灯机制
- CentOS7安装zabbix3.2
- spring-data-redis 使用过程中需要注意的一点(序列化选择)
- Hive技术原理解析
- 关于Spring Data redis几种对象序列化的比较
- Java
- 用Java GUI做一个简单的管理系统
- 策略模式
- 并查集 例题:HDU 1829
- 适配模式
- mysql集群主从及多主