• 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相关文档。

  • 相关阅读:
    发现一个github上特别优秀的面试准备资料
    坠吼的大哥的博客
    [BJDCTF 2nd]假猪套天下第一
    [网鼎杯 2020 朱雀组]phpweb
    [GWCTF 2019]我有一个数据库
    [BJDCTF2020]ZJCTF,不过如此
    [GXYCTF2019]禁止套娃
    洛谷
    [ZJCTF 2019]NiZhuanSiWei
    蓝帽杯决赛-爆炒腰花-WP
  • 原文地址:https://www.cnblogs.com/yueguanguanyun/p/8283127.html
Copyright © 2020-2023  润新知