Spring-data-redis: serializer实例

   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配置文件

Java代码   收藏代码
  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) 程序实例:

Java代码   收藏代码
  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配置:

Java代码   收藏代码
  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) 程序实例:

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

三.sdr与xml

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

`ClassNotFoundException: org.springframework.data.redis.serializer.RedisSerializer` 是一个在尝试加载特定类时抛出的异常。这个类通常出现在 Spring Data Redis 应用程序试图实例化 `RedisSerializer` 类时失败了。 Spring Data Redis 使用 `RedisSerializer` 接口提供序列化和反序列化的功能,用于将 Java 对象转换为 Redis 中的字符串形式以及反之亦然。常见的实现包括 `StringRedisSerializer`、`GenericJackson2JsonRedisSerializer` 等。 当这个异常发生时,通常是由于以下原因之一: 1. **类路径错误**:可能是因为项目依赖缺失或者版本冲突导致无法找到正确的 `RedisSerializer` 实现类文件。 2. **配置错误**:Spring 配置可能没有正确地指定应该使用的 `RedisSerializer` 实例,或者在自定义实现时未能正确导入依赖。 3. **类名拼写错误**:可能是 `RedisSerializer` 的类名输入有误,在配置或者直接引用时出现了错拼。 处理这类异常的一般步骤: - 检查并更新项目的 Maven 或者 Gradle 构建文件,确保所有依赖项都已正确添加并且版本兼容。 - 如果你在配置中自定义了 `RedisSerializer`,检查配置是否准确无误,并确保导入了相应的依赖。 - 使用IDE或者运行工具如 IntelliJ IDEA 的 'Run' -> 'Edit Configurations...' 打开配置编辑界面,检查应用上下文中的 Spring Boot 配置,尤其是关于 Redis 的部分,确认 `RedisSerializer` 类型设置正确。 - 查看具体的堆栈跟踪信息,这通常会提供更多关于异常发生的源代码位置的信息,有助于定位问题所在。 ### 解决方案示例 如果你正在使用默认的 `StringRedisSerializer` 并遇到上述异常,只需确认你的项目构建文件已经包含了 Spring Data Redis 相关依赖即可。例如,在 Maven 的 `pom.xml` 文件中,你应该看到类似下面的依赖声明: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 如果使用的是其他类型的 `RedisSerializer`,比如 `GenericJackson2JsonRedisSerializer`,确保你也相应地导入了其依赖包。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值