Spring Data redis序列化的比较

   redis虽然提供了对list set hash等数据类型的支持,但是没有提供对POJO对象的支持,底层都是把对象序列化后再以字符串的方式存储的。因此,Spring data提供了若干个Serializer,主要包括: 

  • JacksonJsonRedisSerializer
  • JdkSerializationRedisSerializer
  • OxmSerializer

本文主要对比了对象的JacksonJsonRedisSerializer与对象的JdkSerializationSerializer、字符串的StringRedisSerializer与字符串的JdkSerializationSerializer

一、测试代码如下

package com.dream.yuxiaor.utils;

import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JacksonJsonRedisSerializer;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;

import java.io.Serializable;

/**
 * Created by dev on 17-10-14.
 */
public class RedisTest {
    private static RedisTemplate redisTemplate;
    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(300);
        jedisPoolConfig.setMaxTotal(600);
        jedisPoolConfig.setMaxWaitMillis(1000);
        jedisPoolConfig.setTestOnBorrow(true);

        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
        jedisConnectionFactory.setHostName("192.168.3.36");
        jedisConnectionFactory.setPassword(null);
        jedisConnectionFactory.setPort(6379);
        jedisConnectionFactory.setTimeout(2000);
        jedisConnectionFactory.setDatabase(0);
        jedisConnectionFactory.afterPropertiesSet();
        redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        StringRedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
    }

    public static void main(String[] args) {
        writeObjectJdkSerializationRedisSerializer();
        writeObjectJacksonJsonRedisSerializer();
        writeStringJdkSerializationRedisSerializer();
        writeStringStringRedisSerializer();
    }

    public static void writeObjectJdkSerializationRedisSerializer(){
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();

        redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
        redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
        redisTemplate.afterPropertiesSet();

        String key = "test1:";
        long start = System.currentTimeMillis();
        UserObject userObject;
        for(int i=0;i<100000;i++){
            userObject = new UserObject();
            userObject.setAge(i);
            userObject.setUserName("name"+i);
            redisTemplate.opsForValue().set(key+i,userObject);
            redisTemplate.opsForValue().get(key+i);
        }
        System.out.println("100000次读写 writeObjectJdkSerializationRedisSerializer test times(毫秒):"+(System.currentTimeMillis()-start));
    }

    public static void writeObjectJacksonJsonRedisSerializer(){

        JacksonJsonRedisSerializer jacksonJsonRedisSerializer = new JacksonJsonRedisSerializer(UserObject.class);

        redisTemplate.setValueSerializer(jacksonJsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jacksonJsonRedisSerializer);
        redisTemplate.afterPropertiesSet();


        String key = "test2:";
        long start = System.currentTimeMillis();
        UserObject userObject;
        for(int i=0;i<100000;i++){
            userObject = new UserObject();
            userObject.setAge(i);
            userObject.setUserName("name"+i);
            redisTemplate.opsForValue().set(key+i,userObject);
            redisTemplate.opsForValue().get(key+i);
        }
        System.out.println("100000次读写 writeObjectJacksonJsonRedisSerializer test times(毫秒):"+(System.currentTimeMillis()-start));
    }

    public static void writeStringJdkSerializationRedisSerializer(){
        JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();

        redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
        redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
        redisTemplate.afterPropertiesSet();

        String key = "test3:";
        long start = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            redisTemplate.opsForValue().set(key+i,"{\"userName\":\"name"+i+"\",\"age\":"+i+"}");
            redisTemplate.opsForValue().get(key+i);
        }
        System.out.println("100000次读写 writeStringJdkSerializationRedisSerializer test times(毫秒):"+(System.currentTimeMillis()-start));
    }

    public static void writeStringStringRedisSerializer(){

        StringRedisSerializer stringSerializer = new StringRedisSerializer();

        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        redisTemplate.afterPropertiesSet();


        String key = "test4:";
        long start = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            redisTemplate.opsForValue().set(key+i,"{\"userName\":\"name"+i+"\",\"age\":"+i+"}");
            redisTemplate.opsForValue().get(key+i);
        }
        System.out.println("100000次读写 writeStringStringRedisSerializer test times(毫秒):"+(System.currentTimeMillis()-start));
    }

    public static class UserObject implements Serializable {
        private String userName;

        private int age;

        public String getUserName() {
            return userName;
        }

        public void setUserName(String userName) {
            this.userName = userName;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}

二、执行结果比较

1、存储长度比较

127.0.0.1:6379> strlen test1:1
         (integer) 115
127.0.0.1:6379> get test1:1
         "\xac\xed\x00\x05sr\x00,com.dream.yuxiaor.utils.RedisTest$UserObject*\xf0\xb8\x84\xf3\r{\xc3\x02\x00\x02I\x00\x03ageL\x00\buserNamet\x00\x12Ljava/lang/String;xp\x00\x00\x00\x01t\x00\x05name1"

127.0.0.1:6379> strlen test2:1
         (integer) 28
127.0.0.1:6379> get test2:1
         "{\"userName\":\"name1\",\"age\":1}"

127.0.0.1:6379> strlen test3:1
         (integer) 35
127.0.0.1:6379> get test3:1
         "\xac\xed\x00\x05t\x00\x1c{\"userName\":\"name1\",\"age\":1}"

127.0.0.1:6379> strlen test4:1
         (integer) 28
127.0.0.1:6379> get test4:1
         "{\"userName\":\"name1\",\"age\":1}"

2、执行时间比较,跑了三次

第一次:

100000次读写 writeObjectJdkSerializationRedisSerializer test times(毫秒):40441

100000次读写 writeObjectJacksonJsonRedisSerializer test times(毫秒):35915

100000次读写 writeStringJdkSerializationRedisSerializer test times(毫秒):35576

100000次读写 writeStringStringRedisSerializer test times(毫秒):35715


第二次:

100000次读写 writeObjectJdkSerializationRedisSerializer test times(毫秒):39137
100000次读写 writeObjectJacksonJsonRedisSerializer test times(毫秒):34792
100000次读写 writeStringJdkSerializationRedisSerializer test times(毫秒):34543
100000次读写 writeStringStringRedisSerializer test times(毫秒):33807


第三次:

100000次读写 writeObjectJdkSerializationRedisSerializer test times(毫秒):38700
100000次读写 writeObjectJacksonJsonRedisSerializer test times(毫秒):34555
100000次读写 writeStringJdkSerializationRedisSerializer test times(毫秒):34583
100000次读写 writeStringStringRedisSerializer test times(毫秒):34739




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值