Redis序列化存储Java集合List等自定义类型
来源:互联网 发布:超星尔雅网络课程官网 编辑:程序博客网 时间:2024/06/09 09:23
在“Redis学习总结和相关资料”http://blog.csdn.net/fansunion/article/details/49278209
这篇文章中,对Redis做了总体的介绍,演示了Jedis和SpringDataRedis访问Redis的相关例子。
对于基本的CRUD差不多够了。
随着项目中使用场景的增多,出现了存储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序列化这个问题解决了,感觉方法很简单。
还是那句经典的话“难题不会,会题不难”。
等把问题解决了,再难的问题,已经变得简单了。没解决的时候,急死你。
伙计,加油~
0 0
- Redis序列化存储Java集合List等自定义类型
- Redis序列化存储Java集合List等自定义类型
- 怎样在Redis通过StackExchange.Redis 存储集合类型List
- Redis存储List<T>集合
- 自定义超实用Redis工具类(满足对象,list,map等类型)
- NoSQL之Redis(二)---Java操作Redis存储自定义类型数据
- 使用XmlSerializer类将对象序列化为Xml格式保存 - 支持泛型的Dictionary,list 等集合类型
- Hibernate自定义类型 集合字符串 存储
- java操作redis数据库二:list集合
- Java集合框架List,Map,Set等
- Redis缓存Object,List对象 - Java 对象和List的序列化和反序列化
- Java集合序列化
- java list序列化
- java基础:集合类型set,list,map
- 使用:Comparison委托,为list等集合做自定义排序。
- redis jedis存储对象简单操作,map list 自定义对象
- redis 存储自定义java对象有几种方式
- Java 7之集合类型第2篇 - List集合
- 统计字符串中字符出现的次数(TreeMap、HashMap)
- Matlab中的图形句柄(转载)
- ThinkPHP3.2.3生成二维码
- 第九周项目三稀疏矩阵的三元组表示的实现及应用(1)
- c语言结构体类型占用的内存空间,需要考虑字节对齐
- Redis序列化存储Java集合List等自定义类型
- ECharts, PHP, MySQL, Ajax, JQuery 实现前后端数据可视化
- Javascript继承(原型链)
- 神经网络六:深度学习斯坦福cs231n 课程笔记
- 巨神坑之GridView
- 2016年java编写一个界面计算机实现
- Linux 各种查看网卡流量的方法
- php代码规范 及工具使用
- 个人笔记-jquery 树形下拉框,赋前后台代码