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特性”:

一. JdkSerializationRedisSerializer/StringRedisSerializer

1) spring配置文件

  1. <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
  2. <property name="connectionFactory" ref="jedisConnectionFactory"></property>
  3. <property name="keySerializer">
  4. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  5. </property>
  6. <property name="hashKeySerializer">
  7. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  8. </property>
  9. <property name="valueSerializer">
  10. <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
  11. </property>
  12. <property name="hashValueSerializer">
  13. <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
  14. </property>
  15. </bean>

2) 程序实例:

  1. ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
  2. User user = new User("zhangsan",12);
  3. valueOper.set("user:1", user);
  4. System.out.println(valueOper.get("user:1").getName());

其中User为pojo类,且需要实现Serializable接口。

二.sdr与json

1) spring配置:

  1. <bean id="jsonSerializer" class="com.sample.redis.sdr.JsonRedisSerializer"/>
  2. <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
  3. <property name="connectionFactory" ref="jedisConnectionFactory"></property>
  4. <property name="defaultSerializer">
  5. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  6. </property>
  7. </bean>

并没有在配置文件中,使用JacksonJsonRedisSerializer,因为这样实在是麻烦而且不灵活(主要是jackson需要ClassType)。我们将在java代码进行转换,因为通过java代码,使用jackson工具将json字符串转换成javabean是非常简单的。

2) 程序实例:

  1. /**
  2. * 不使用sdr自带的json序列化工具,一切操作基于string
  3. **/
  4. public class JsonRedisSeriaziler{
  5. public static final String EMPTY_JSON = "{}";
  6. public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
  7. protected ObjectMapper objectMapper = new ObjectMapper();
  8. public JsonRedisSeriaziler(){}
  9. /**
  10. * java-object as json-string
  11. * @param object
  12. * @return
  13. */
  14. public String seriazileAsString(Object object){
  15. if (object== null) {
  16. return EMPTY_JSON;
  17. }
  18. try {
  19. return this.objectMapper.writeValueAsString(object);
  20. } catch (Exception ex) {
  21. throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
  22. }
  23. }
  24. /**
  25. * json-string to java-object
  26. * @param str
  27. * @return
  28. */
  29. public <T> T deserializeAsObject(String str,Class<T> clazz){
  30. if(str == null || clazz == null){
  31. return null;
  32. }
  33. try{
  34. return this.objectMapper.readValue(str, clazz);
  35. }catch (Exception ex) {
  36. throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
  37. }
  38. }
  39. }
  1. public class RedisClientTest {
  2. private JsonRedisSeriaziler seriaziler;
  3. private RedisTemplate redisTemplate;
  4. public void setSeriaziler(JsonRedisSeriaziler seriaziler) {
  5. this.seriaziler = seriaziler;
  6. }
  7. public void setRedisTemplate(RedisTemplate redisTemplate) {
  8. this.redisTemplate = redisTemplate;
  9. }
  10. public void insertUser(User user){
  11. ValueOperations<String, String> operations = redisTemplate.opsForValue();
  12. operations.set("user:" + user.getName(), seriaziler.seriazileAsString(user));
  13. }
  14. public User getUser(String name){
  15. ValueOperations<String, String> operations = redisTemplate.opsForValue();
  16. String json = operations.get("user:" + name);
  17. return seriaziler.deserializeAsObject(json, User.class);
  18. }
  19. }

三.sdr与xml

    实施办法可以参见本文“sdr与json”,同时参考spring-oxm相关文档。

Spring-data-redis: serializer实例的更多相关文章

  1. Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

    一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...

  2. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  3. spring data redis 理解

    前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...

  4. Spring Data Redis 详解及实战一文搞定

    SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...

  5. Spring Data Redis学习

    本文是从为知笔记上复制过来的,懒得调整格式了,为知笔记版本是带格式的,内容也比这里全.点这里 为知笔记版本 Spring Data Redis 学习 Version 1.8.4.Release 前言 ...

  6. Redis(八):spring data redis 理解

    前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...

  7. Redis与Spring Data Redis

    1.Redis概述 1.1介绍 官网:https://redis.io/ Redis是一个开源的使用ANSIC语言编写.支持网络.可基于内存 亦可持久化的日志型.Key-Value型的高性能数据库. ...

  8. Spring Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  9. Spring Data Redis—Pub/Sub(附Web项目源码) (转)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  10. org.springframework.data.redis.serializer.SerializationException: Cannot serialize;

    前言 本文中提到的解决方案,源码地址在:perfect-ssm,希望可以帮你解决问题. 问题描述 在Spring与Redis整合过程中,出现了如下报错: org.springframework.dat ...

随机推荐

  1. SpringBoot--配置详解

    SpringBoot使用了一个全局的配置文件application.properties,放在src/mian/resource目录下或者类路径的/config下.springboot的全局配置文件的 ...

  2. 第二节,surf特征检测关键点,实现图片拼接

    初级的图像拼接为将两幅图像简单的粘贴在一起,仅仅是图像几何空间的转移和合成,与图像内容无关:高级图像拼接也叫做基于特征匹配的图像拼接,拼接时消去两幅图像相同的部分,实现拼接全景图. 实现步骤: 1.采 ...

  3. VMware网络问题

    配置好网络的虚拟机,隔一段时间后可能会发现网络不可用了,此时可以检查一下以下3个服务是否开启 一般情况下,启动以上三个服务后网络就通了. 如果以上服务都启动了还不行,那就重启一下网络: # servi ...

  4. 识别oracle数据库软件版本号

    由于Oracle数据库不断发展并可能需要维护,因此Oracle会定期生成新版本.并非所有客户最初都订阅新版本或需要对其现有版本进行特定维护.因此,该产品的多个版本同时存在. 可能需要多达五个数字才能完 ...

  5. 美团点评基于MGR的CMDB高可用架构搭建之路【转】

    王志朋 美团点评DBA 曾在京东金融担任DBA,目前就职于美团点评,主要负责金融业务线数据库及基础组件数据库的运维. MySQL Group Replication(以下简称MGR),于5.7.17版 ...

  6. 【转】Java并发编程:Thread类的使用

    一.线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于对Thread类中的方法的理解. 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以 ...

  7. VS2017打包C#桌面应用

    原文地址:https://blog.csdn.net/houheshuai/article/details/78518097 在要打包项目的解决方案 右键→添加→ 新建项目 后出现如下选择 如果没有V ...

  8. JUnit3 和 JUnit4的区别

    JUnit3 和 JUnit4的区别 1.JUnit 4使用org.junit.*包而JUnit 3.8使用的是junit.Framework.*;为了向后兼容,JUnit4发行版中加入了这两种包. ...

  9. kafka manager安装配置和使用

    kafka manager安装配置和使用 .安装yum源 curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintra ...

  10. linux mysql 定时备份 使用crontab

    第一步:在服务器上配置备份目录代码: mkdir /var/lib/mysqlbackup cd /var/lib/mysqlbackup 第二步:编写备份脚本代码:  vi dbbackup.sh ...