spring-data-redis 使用過程中需要注意的一點

jopen 9年前發布 | 124K 次閱讀 Redis 緩存服務器

在項目中需要用到redis做緩存,于是采用spring-data-redis,并且打算自己封裝一個redis的靜態工具類。后來在進行單元測試的過程中發現了一個容易出錯的地方,于是打算記錄下來,并分享給各位朋友。

這里主要說下碰到的問題,首先,采用了spring-data-redis(以下簡稱SDR)中的Template進行redis的操作。

因為考慮到后期的使用場景,于是同時采用了StringRedisTemplate和RedisTemplate,并且對存儲String與存儲Java對象采用不同的Template進行了簡單的封裝。

首先是測試 保存與取出方法。分別用不同的template可以完美通過。

然后在測試刪除的方法中,測試出現了問題。

問題如下:

    在采用StringRedisTemplate進行保存的數據,用StringRedisTemplate去刪除可以成功刪除。

    在采用RedisTemplate進行保存的數據,用RedisTemplate去刪除也可以刪除成功。

    在用RedisTemplate去刪除StringRedisTemplate保存的數據時,發現刪除失敗。

    在用StringRedisTemplate去刪除RedisTemplate保存的數據時,刪除失敗。

因為,需要封裝一套通用的刪除方法,并且需要封裝一個批量刪除的方法。所以研究了下問題出現的原因。

經過查看SDR官方給出的文檔,發現是因為序列化策略的問題。

這里簡單說下:

    SDR默認采用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。

    StringRedisTemplate默認采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

    RedisTemplate默認采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

就是因為序列化策略的不同,即使是同一個key用不同的Template去序列化,結果是不同的。所以根據key去刪除數據的時候就出現了刪除失敗的問題。

解決方法如下,手動指定RedisTemplate的key的序列化策略

<!-- redis 序列化策略 ,通常情況下key值采用String序列化策略, -->
<!-- 如果不指定序列化策略,StringRedisTemplate的key和value都將采用String序列化策略; -->
<!-- 但是RedisTemplate的key和value都將采用JDK序列化 這樣就會出現采用不同template保存的數據不能用同一個template刪除的問題 -->
<bean id="stringRedisSerializer" 
    class="org.springframework.data.redis.serializer.StringRedisSerializer" />

<bean id='redisWriteTemplate' class="org.springframework.data.redis.core.RedisTemplate">     <property name="connectionFactory" ref="jedisWriteConnectionFactory" />     <property name="keySerializer" ref="stringRedisSerializer" />     <property name="hashKeySerializer" ref="stringRedisSerializer" /> </bean></pre>

這樣就能完美的刪除了。

這里推薦將所有Template的key都采用String的序列化方式,而value的序列化方式可以采用不同的序列化方式。

另外 出來這兩個序列化方式之外,SDR還提供了  

JacksonJsonRedisSerializer
Jackson2JsonRedisSerializer
OxmSerializer

等序列化方法,大家可以分別采用各種序列化方式做一些試驗。

來自:http://my.oschina.net/u/1402563/blog/391744

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!