serializer策略
spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷。提供了4种内置的serializer:
-
JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
-
StringRedisSerializer:字符串编码,数据以string存储
-
JacksonJsonRedisSerializer:json格式存储
-
OxmSerializer:xml格式存储
其中JdkSerializationRedisSerializer和StringRedisSerializer是最基础的序列化策略,
其中“JacksonJsonRedisSerializer”与“OxmSerializer”都是基于stirng存储,因此它们是较为“高级”的序列化(最终还是使用string解析以及构建java对象)。
RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”:
- keySerializer :对于普通K-V操作时,key采取的序列化策略
- valueSerializer:value采取的序列化策略
- hashKeySerializer: 在hash数据结构中,hash-key的序列化策略
- 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
- 全部大写
- key不能太长也不能太短;
- key之间以:分开;
id | name |
---|---|
1 | zs |
redis使用时,注意命名空间;
项目名或缩写:表明转换为key前缀:区分key的字段(主键列名):主键值
设置token
{
"PRO:USER:LOGINNAME:373166324":"2kd-dsj5ce-d4445-h4sd472"
}