標籤:ctr art 序列化 final inpu 配置 操作 儲存 des
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代碼
- <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
- <property name="connectionFactory" ref="jedisConnectionFactory"></property>
- <property name="keySerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- </property>
- <property name="hashKeySerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- </property>
- <property name="valueSerializer">
- <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
- </property>
- <property name="hashValueSerializer">
- <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
- </property>
- </bean>
2) 程式執行個體:
Java代碼
- ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
- User user = new User("zhangsan",12);
- valueOper.set("user:1", user);
- System.out.println(valueOper.get("user:1").getName());
其中User為pojo類,且需要實現Serializable介面。
二.sdr與json
1) spring配置:
Java代碼
- <bean id="jsonSerializer" class="com.sample.redis.sdr.JsonRedisSerializer"/>
- <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
- <property name="connectionFactory" ref="jedisConnectionFactory"></property>
- <property name="defaultSerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- </property>
- </bean>
並沒有在設定檔中,使用JacksonJsonRedisSerializer,因為這樣實在是麻煩而且不靈活(主要是jackson需要ClassType)。我們將在java代碼進行轉換,因為通過java代碼,使用jackson工具將json字串轉換成javabean是非常簡單的。
2) 程式執行個體:
Java代碼
- /**
- * 不使用sdr內建的json序列化工具,一切操作基於string
- **/
- public class JsonRedisSeriaziler{
- public static final String EMPTY_JSON = "{}";
-
- public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
-
- protected ObjectMapper objectMapper = new ObjectMapper();
- public JsonRedisSeriaziler(){}
-
- /**
- * java-object as json-string
- * @param object
- * @return
- */
- public String seriazileAsString(Object object){
- if (object== null) {
- return EMPTY_JSON;
- }
- try {
- return this.objectMapper.writeValueAsString(object);
- } catch (Exception ex) {
- throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
- }
- }
-
- /**
- * json-string to java-object
- * @param str
- * @return
- */
- public <T> T deserializeAsObject(String str,Class<T> clazz){
- if(str == null || clazz == null){
- return null;
- }
- try{
- return this.objectMapper.readValue(str, clazz);
- }catch (Exception ex) {
- throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
- }
- }
-
- }
Java代碼
- public class RedisClientTest {
-
- private JsonRedisSeriaziler seriaziler;
-
- private RedisTemplate redisTemplate;
-
- public void setSeriaziler(JsonRedisSeriaziler seriaziler) {
- this.seriaziler = seriaziler;
- }
-
- public void setRedisTemplate(RedisTemplate redisTemplate) {
- this.redisTemplate = redisTemplate;
- }
-
-
- public void insertUser(User user){
- ValueOperations<String, String> operations = redisTemplate.opsForValue();
- operations.set("user:" + user.getName(), seriaziler.seriazileAsString(user));
- }
-
- public User getUser(String name){
- ValueOperations<String, String> operations = redisTemplate.opsForValue();
- String json = operations.get("user:" + name);
- return seriaziler.deserializeAsObject(json, User.class);
- }
- }
三.sdr與xml
實施辦法可以參見本文“sdr與json”,同時參考spring-oxm相關文檔。
Spring-data-redis: serializer執行個體