spring-data-redis序列化实践笔记
来源:互联网 发布:加农炮升级数据 编辑:程序博客网 时间:2024/05/17 09:24
- JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。
- StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
- JacksonJsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】
- OxmSerializer:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持】
spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷。sdr提供了4种内置的serializer:
- JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
- StringRedisSerializer:字符串编码,数据以string存储
- JacksonJsonRedisSerializer:json格式存储
- OxmSerializer:xml格式存储
其中JdkSerializationRedisSerializer和StringRedisSerializer是最基础的序列化策略,其中“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。
接下来,通过实例描述如何使用它们,可以首先参考“spring-data-redis特性”:
pring-data-redis: serializer实例
@Bean public RedisTemplate<String, Object> jdkRedisTemplate( RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setValueSerializer(jdkSerializationRedisSerializer); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(jdkSerializationRedisSerializer); template.afterPropertiesSet(); return template; }
@Resource(name = "jdkRedisTemplate") // if stringRedisTemplate, result in SmsCheck cannot be cast to java.lang.String private RedisTemplate<String, Object> jdkRedisTemplate;
@RequestMapping(value = "testRedis", method = RequestMethod.POST) @ResponseBody @ApiImplicitParams({}) @ApiOperation(value="testRedis") public Object testRedis() { SmsCheck smsCheck = new SmsCheck(); smsCheck.setMobile("xxx"); // 设置缓存 jdkRedisTemplate.opsForValue().set("test",smsCheck); return null; }
@Entitypublic class SmsCheck implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "sms_check_id")private int smsCheckId;private String mobile;。。。。。。
"\xac\xed\x00\x05sr\x00\x1ecom.ilex.xxx.model.SmsCheck\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x05I\x00\nsmsCheckIdL\x00\acontentt\x00\x12Ljava/lang/String;L\x00\ncreateDatet\x00\x10Ljava/util/Date;L\x00\x06mobileq\x00~\x00\x01L\x00\x04typeq\x00~\x00\x01xp\x00\x00\x00\x00ppt\x00\x03xxxp"
"[\"com.xxx.xx.model.SmsCheck\",{\"smsCheckId\":0,\"mobile\":\"xxx\",\"type\":null,\"content\":null,\"createDate\":null}]"
1) "\xac\xed\x00\x05t\x00\x04test"
2) "test"
最近在开始在学习Redis以及如何在Java当中去使用Redis,Redis是什么我这里就不说了。
我主要想说的是Redis和Java当中Spring结合起来的时候,使用到的RedisTemplate和StringRedisTemplate
他们两者之间的区别,以及该怎么使用。
当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的
关于RedisTemplate和StringRedisTemplate
Redis:存储对象的两种方式(序列化和json字符串)
- spring-data-redis序列化实践笔记
- Spring Data Redis 实践
- spring-data-redis key-value序列化
- spring-data-redis 的序列化问题
- Spring Data Redis(sdr)-----序列化
- Spring Data redis序列化的比较
- Redis 使用spring-data-redis的序列化问题
- spring-data-redis中的序列化/反序列化
- 使用kryo作为spring data redis的序列化器
- spring-data-redis使用自定义序列化数据 使用 protobuf
- spring data redis serializer SerializationException 序列化问题
- spring-data-redis increment 命令序列化失败
- Spring Data Redis ---笔记2
- Spring Data Redis ---笔记3
- Spring Data Redis -----笔记4
- Spring Data Redis Redis集群---笔记5
- Spring Data Redis ----Redis仓库----笔记6
- spring-data-redis 整合,以及使用kryo序列化代替jdk原生序列化机制
- POJ
- Linux ALSA音频框架分析四:ALSA 的硬件抽象
- 了解 ARM Coretex-A 系列芯片
- iOS开发笔记之判断字符串是否为浮点型或整型
- 认识ServletContext
- spring-data-redis序列化实践笔记
- Dynamic CRM 2016使用WEB API删除记录(js)
- 构建高性能的弹幕应用
- Thread Safety Analysis
- 安装红帽linux到虚拟机
- 两列等高布局详解
- 简单的车牌识别预处理小程序
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- 乱码问题集锦