本文转自http://stamen.iteye.com/blog/1907984
问题
最近在整一个spring data
redis,网上有一本《Spring Data》的电子书(我一个朋友正在翻译,应该今年会有中文版出来,人邮的),下载来看了一下,其中第8章讲到了Spring
data对redis的支持。
redis虽然提供了对list set
hash等数据类型的支持,但是没有提供对POJO对象的支持,底层都是把对象序列化后再以字符串的方式存储的。因此,Spring
data提供了若干个Serializer,主要包括:
参见:http://static.springsource.org/spring-data/data-keyvalue/docs/1.0.x/api/
这里,我第一是想测试一下三者的使用,第二是想看看它们的使用效果。
准备工作
下载源码
我直接在《Spring
Data》书的源码基础上改,从这下载书的源码:https://github.com/SpringSource/spring-data-book
打开redis子项目,由于是以Maven组织的,所以不用关心包的问题。
添加一个测试的Entity
由于我们希望测试使用Redis保存POJO对象,因此我们在com.oreilly.springdata.redis包下创建一个User对象,如下所示:
由于后面,我们需要使用OXM及Jackson将进行对象序列,为了控制对象的序列化,因此打上了JSR
175注解。
更改ApplicationConfig
ApplicationConfig是Spring容器的配置类,要根据你的环境进行更改,我的更改为:
1)redisConnectionFactory()配置了如何连接Redsi服务器(如何安装Redis,参见:http://redis.io/download)
2)oxmSerializer()是我新增的,用于定义一个基于Jaxb2Marshaller的OxmSerializer Bean(后面将会用到)
编写测试用例
打开KeyValueSerializersTest,我们几个额外的测试用例都将写在该测试类中:
使用JdkSerializationRedisSerializer序列化
JdkSerializationRedisSerializer支持对所有实现了Serializable的类进行序列化。运行该测试用例,我们通过redis-cli
通过“users/user1”键可以查看到对应的值,内容如下:
通过strlen查看对应的字符长度:
上面的代码共进行了100次的存储和获取,其所花时间如下(毫秒):
使用JacksonJsonRedisSerializer序列化
@Test public void testJacksonSerialiable() { RedisTemplate<String, Object> redis = new RedisTemplate<String, Object>(); redis.setConnectionFactory(connectionFactory); redis.setKeySerializer(ApplicationConfig.StringSerializer.INSTANCE); redis.setValueSerializer(new JacksonJsonRedisSerializer<User>(User.class)); redis.afterPropertiesSet(); ValueOperations<String, Object> ops = redis.opsForValue(); User user1 = new User(); user1.setUserName("user1"); user1.setAge(20); User user11 = null; String key1 = "json/user1"; long begin = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { ops.set(key1,user1); user11 = (User)ops.get(key1); } long time = System.currentTimeMillis() - begin; System.out.println("json time:"+time); assertThat(user11.getUserName(),is("user1")); }
运行后,查看redis的内容及内容长度:
执行花费时间为:
使用OxmSerialiable序列化
@Test public void testOxmSerialiable() throws Throwable{ RedisTemplate<String, Object> redis = new RedisTemplate<String, Object>(); redis.setConnectionFactory(connectionFactory); redis.setKeySerializer(ApplicationConfig.StringSerializer.INSTANCE); redis.setValueSerializer(oxmSerializer); redis.afterPropertiesSet(); ValueOperations<String, Object> ops = redis.opsForValue(); User user1 = new User(); user1.setUserName("user1"); user1.setAge(20); User user11 = null; String key1 = "oxm/user1"; long begin = System.currentTimeMillis(); for (int i = 0; i < 100; i++) { ops.set(key1,user1); user11 = (User)ops.get(key1); } long time = System.currentTimeMillis() - begin; System.out.println("oxm time:"+time); assertThat(user11.getUserName(),is("user1")); }
运行后,查看redis的内容及内容长度:
执行花费时间为:
小结
从执行时间上来看,JdkSerializationRedisSerializer是最高效的(毕竟是JDK原生的),但是是序列化的结果字符串是最长
的。JSON由于其数据格式的紧凑性,序列化的长度是最小的,时间比前者要多一些。而OxmSerialiabler在时间上看是最长的(当时和使用具体
的Marshaller有关)。所以个人的选择是倾向使用JacksonJsonRedisSerializer作为POJO的序列器。
原文:http://www.cnblogs.com/google4y/p/3535106.html