redis serializer策略

Redis序列化选型及应用

serializer策略

 spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷。提供了4种内置的serializer:
  1. JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储

  2. StringRedisSerializer:字符串编码,数据以string存储

  3. JacksonJsonRedisSerializer:json格式存储

  4. OxmSerializer:xml格式存储

    其中JdkSerializationRedisSerializerStringRedisSerializer是最基础的序列化策略,

    其中“JacksonJsonRedisSerializer”与“OxmSerializer”都是基于stirng存储,因此它们是较为“高级”的序列化(最终还是使用string解析以及构建java对象)。

RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”:

  1. keySerializer :对于普通K-V操作时,key采取的序列化策略
  2. valueSerializer:value采取的序列化策略
  3. hashKeySerializer: 在hash数据结构中,hash-key的序列化策略
  4. hashValueSerializer:hash-value的序列化策略
    无论如何,建议key/hashKey采用StringRedisSerializer。

RedisTemplate序列化策略效率对比:

1.JdkSerializationRedisSerializer
2.GenericJackson2JsonRedisSerializer
3.Jackson2JsonRedisSerializer

@Test
public void test7(){
  Page<SysMessageEvent> page = sysMessageEventDao.findAll(Pages.Helper.pageable(1, 200, null));
  List<SysMessageEvent> list = page.getContent();
  JdkSerializationRedisSerializer j = new JdkSerializationRedisSerializer();
  GenericJackson2JsonRedisSerializer g = new GenericJackson2JsonRedisSerializer();
  Jackson2JsonRedisSerializer j2 = new Jackson2JsonRedisSerializer(List.class);
  TimeTest tt = new TimeTest();
  tt.setStartTime();
  byte[] bytesJ = j.serialize(list);
  tt.setEndTime();
  System.out.println("JdkSerializationRedisSerializer序列化时间:"+tt.getExcuteTime() + "ms,序列化后的长度:" + bytesJ.length);
  tt.setStartTime();
  j.deserialize(bytesJ);
  tt.setEndTime();
  System.out.println("JdkSerializationRedisSerializer反序列化时间:"+tt.getExcuteTime());
  tt.setStartTime();
  byte[] bytesG = g.serialize(list);
  tt.setEndTime();
  System.out.println("GenericJackson2JsonRedisSerializer序列化时间:"+tt.getExcuteTime() + "ms,序列化后的长度:" + bytesG.length);
  tt.setStartTime();
  g.deserialize(bytesG);
  tt.setEndTime();
  System.out.println("GenericJackson2JsonRedisSerializer反序列化时间:"+tt.getExcuteTime());
  tt.setStartTime();
  byte[] bytesJ2 = j2.serialize(list);
  tt.setEndTime();
  System.out.println("Jackson2JsonRedisSerializer序列化时间:"+tt.getExcuteTime() + "ms,序列化后的长度:" + bytesJ2.length);
  tt.setStartTime();
  j2.deserialize(bytesJ2);
  tt.setEndTime();
  System.out.println("Jackson2JsonRedisSerializer反序列化时间:"+tt.getExcuteTime());
}

测试数据(总共200条记录的List集合),单条类似:

{
    "channel": "USER_LOGIN@30-9C-23-83-D0-9C", 
    "createTime": 1526973952000, 
    "doneHost": "192.168.80.10:62016", 
    "doneServer": "he-pm", 
    "doneTime": 1526973952000, 
    "eventInfoJson": "{\"userName\":\"Mos.Jiang\",\"targetId\":\"250524c0-8869-4fc2-a4aa-278a5a5b3197\",\"localId\":\"250524c0-8869-4fc2-a4aa-278a5a5b3197\",\"first\":\"您好,您账号已经登录\",\"keyword1\":\"2018年05月22日 15:25\",\"keyword2\":\"127.0.0.1\",\"remark\":\"如果本次登录不是您本人所为,说明您的帐号已经被盗!为减少您的损失,请立即联系客服 4008271580。\"}", 
    "hasDone": 1, 
    "id": "006bdac0-0ba0-498d-b654-28fa6038f747", 
    "sendCount": 1, 
    "sendTime": 1526973952000, 
    "senderInfo": "com.mj.he800.pm.service.user.UserBaseInfoService#userLogin-215"
}

测试结果:

JdkSerializationRedisSerializer序列化时间:11,序列化后的长度:94551,反序列化时间:15
GenericJackson2JsonRedisSerializer序列化时间:18,序列化后的长度:151108,反序列化时间:14
Jackson2JsonRedisSerializer序列化时间:5,序列化后的长度:125489,反序列化时间:3

简单地可以看出:Jackson2JsonRedisSerializer序列化和反序列化效率高,JdkSerializationRedisSerializer序列化后的结果最短。

redis key

  1. 全部大写
  2. key不能太长也不能太短;
  3. key之间以:分开;
idname
1zs

redis使用时,注意命名空间;

项目名或缩写:表明转换为key前缀:区分key的字段(主键列名):主键值

设置token

{
	"PRO:USER:LOGINNAME:373166324":"2kd-dsj5ce-d4445-h4sd472"
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值