Redis序列化存储Java集合List等自定义类型

原创 2015年11月17日 17:49:33

在“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序列化这个问题解决了,感觉方法很简单。
 还是那句经典的话“难题不会,会题不难”。
 等把问题解决了,再难的问题,已经变得简单了。没解决的时候,急死你。
 伙计,加油~

版权声明:小雷FansUnion的版权声明

Redis 存储List对象

如果需要用到Redis存储List对象,而list又不需要进行操作,可以按照MC的方式进行存储,不过Jedis之类的客户端没有提供API,可以有两种思路实现: 1.      分别序列化 eleme...

Redis存储Object 和 list<object>

Redis 存储支持的类型没有object ,虽然有支持list,但是只支持List 有两种方法可以实现存储对象和泛型 1.用序列化和反序列化 2.json 序列化工具类,实现序列化和反序列话对象...
  • tuposky
  • tuposky
  • 2015年04月28日 17:56
  • 11197

Redis操作List工具类封装,Java Redis List命令封装

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过4...

java操作redis数据库二:list集合

package com.redis; import java.util.List; import redis.clients.jedis.Jedis; /**  * 这...

java 操作Redis list 命令 实例(Jedis) (四)

package com.jjf.redis; import org.junit.Assert; import org.junit.Test; import redis.clients.jedis.B...

java操作redis: 将string、list、map、自定义的对象保存到redis中

【redis,1】java操作redis: 将string、list、map、自定义的对象保存到redis中 转自:http://www.tuicool.com/articles/U7JNr...

redis存储和查询的java实现

1.Redis简介  Redis是一个key-value存储系统。和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lis...

Redis系列-存储篇list主要操作函数小结

在总结list之前,先要弄明白几个跟list相关的概念: 列表:一个从左到右的队列,个人理解更类似于一个栈,常规模式下,先进列表的元素,后出。 表头元素:列表最左端第一个元素。 表尾元素:列表最...

Redis– Jedis存储Java对象 - (Java序列化为byte数组方式) Java 序列化和反序列化

package com.mind.core.db.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputS...

redis存储对象和集合

使用redis存储对象或集合时,不能直接存储。需要将对象或集 合通过序列化转换为可存储的json,这里使用了fastjson来转型 redis是一个key-value存储系统。和Memcached...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis序列化存储Java集合List等自定义类型
举报原因:
原因补充:

(最多只允许输入30个字)