Redis序列化存储Java集合List等自定义类型
2015-11-17 17:49
579 查看
在“Redis学习总结和相关资料”http://blog.csdn.net/fansunion/article/details/49278209这篇文章中,对Redis做了总体的介绍,演示了Jedis和SpringDataRedis访问Redis的相关例子。对于基本的CRUD差不多够了。
随着项目中使用场景的增多,出现了存储Java集合List的情况。这个时候,一般的代码很可能会报错,比如“无法序列化”,“序列化失败”之类的~
经过几个小时的实践探索,参考了在秒针工作的代码以及最近的代码,有2种可行方法。
需要说明的是,项目中用的是SpringDataRedis,但是Jedis代码的思路也是一样的。
项目中的Redis配置
直接存储java.util.List会提示“无法序列化”,“JdkSerializationRedisSerializer序列化失败”类似的错误,简单的把java.util.List的元素实现Serialiable接口,是不行的。也考虑了下,是不是和List元素的serialVersionUID有关系,最初用的是默认值1,改成系统生成的,也还是不行. private static final long serialVersionUID = -2162380932844568332L; 方法1:把List转换成JSON,存储到Redis,取出来的时候,再把JSON转换成List。这种方法也很不错,但是,当时咋就没有想到呢。序列化存储
反序列化
需要特别说明的是, JSONObject.parseArray可以把json格式的字符串,转换成Java的List。这个方法之前用的少,一直不熟悉,第2个参数是List元素的class。 自己写的1个Demo。
方法2:把List转换成二进制数组byte[],存储到Redis,取出来的时候,再把byte[]转成List。序列化list->byte[]
二进制反序列化byte[]->list listInRedis = HproseFormatter.unserialize((byte[] )bytesInRedis); 项目中用的是源代码,从秒针代码中copy出来的库。 上述2种方法,使用JSON序列化存储,感觉更简单一些。 但是据说HproseFormatter这个库,很牛逼,按照官网的说法。
Hprose(High Performance Remote Object Service Engine)是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。
网上找到了hprose的资料,不出意外的话,可以用下面这个的。 hprose/hprose-java https://github.com/hprose/hprose-java/tree/master/src Map等其它类型的存储,和List类似~ 把Redis序列化这个问题解决了,感觉方法很简单。 还是那句经典的话“难题不会,会题不难”。 等把问题解决了,再难的问题,已经变得简单了。没解决的时候,急死你。 伙计,加油~
随着项目中使用场景的增多,出现了存储Java集合List的情况。这个时候,一般的代码很可能会报错,比如“无法序列化”,“序列化失败”之类的~
经过几个小时的实践探索,参考了在秒针工作的代码以及最近的代码,有2种可行方法。
需要说明的是,项目中用的是SpringDataRedis,但是Jedis代码的思路也是一样的。
项目中的Redis配置
<bean id="businessRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="businessConnectionFactory" /> <!--如果不配置Serializer,那么存储的时候智能使用String,如果用User类型存储,那么会提示错误User can't cast to String!!! --> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> </property> </bean>
直接存储java.util.List会提示“无法序列化”,“JdkSerializationRedisSerializer序列化失败”类似的错误,简单的把java.util.List的元素实现Serialiable接口,是不行的。也考虑了下,是不是和List元素的serialVersionUID有关系,最初用的是默认值1,改成系统生成的,也还是不行. private static final long serialVersionUID = -2162380932844568332L; 方法1:把List转换成JSON,存储到Redis,取出来的时候,再把JSON转换成List。这种方法也很不错,但是,当时咋就没有想到呢。序列化存储
List list = new ArrayList(); String json=JSONObject.toJSONString(list); logger.info("save json="+json); defaultCache.add(key, json, CATCHE_TIME);
反序列化
Object jsonInRedis = defaultCache.getValue(key); List<MatchContent> list = null; Object listInRedis = null; if(jsonInRedis != null){ logger.info("get json="+jsonInRedis); listInRedis= JSONObject.parseArray(jsonInRedis.toString(), MatchContent.class); } if (listInRedis instanceof List) { list = (List) listInRedis; logger.debug("Find fund4Project in redis~ size=" + list.size()); }
需要特别说明的是, JSONObject.parseArray可以把json格式的字符串,转换成Java的List。这个方法之前用的少,一直不熟悉,第2个参数是List元素的class。 自己写的1个Demo。
public static void main(String[] args) { List list = new ArrayList(); list.add(new User()); String json=JSONObject.toJSONString(list); System.out.println(json); List newList=JSONObject.parseArray(json, User.class); System.out.println(newList.size()); }
方法2:把List转换成二进制数组byte[],存储到Redis,取出来的时候,再把byte[]转成List。序列化list->byte[]
import hprose.io.HproseFormatter; java.io.ByteArrayOutputStream baos=HproseFormatter.serialize(list); byte[] bytes=baos.toByteArray();
二进制反序列化byte[]->list listInRedis = HproseFormatter.unserialize((byte[] )bytesInRedis); 项目中用的是源代码,从秒针代码中copy出来的库。 上述2种方法,使用JSON序列化存储,感觉更简单一些。 但是据说HproseFormatter这个库,很牛逼,按照官网的说法。
Hprose(High Performance Remote Object Service Engine)是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。
网上找到了hprose的资料,不出意外的话,可以用下面这个的。 hprose/hprose-java https://github.com/hprose/hprose-java/tree/master/src Map等其它类型的存储,和List类似~ 把Redis序列化这个问题解决了,感觉方法很简单。 还是那句经典的话“难题不会,会题不难”。 等把问题解决了,再难的问题,已经变得简单了。没解决的时候,急死你。 伙计,加油~
相关文章推荐
- Redis监控方案
- Redis总结(二)C#中如何使用redis
- 内存替换redis hll
- redis集群方案总结
- redis缓存技术学习 www.iigrowing.cn/redis-huan-cun-ji-shu-xue-xi.html
- mysql保障数据一致性:redis与mysql数据同步(二)
- 初学Redis(2)——用Redis作为Mysql数据库的缓存
- (转) Redis 遇到的坑
- redis性能相关的数据指标
- 查看远程Redis服务器的版本
- java之redis篇(spring-data-redis整合)
- Redis学习笔记2-Redis的集群
- redis的Java客户端jedis池的介绍及使用
- Redis简单操作Java代码
- Redis编程--Perl接口及内建Lua脚本应用
- Redis with HA
- Redis安全性配置
- redis基础的字符串类型
- 持久化redis
- redis常用命令部分整理和含义