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

這裏主要說下碰到的問題,首先,採用了spring-data-redis(如下簡稱SDR)中的Template進行redis的操做。redis

由於考慮到後期的使用場景,因而同時採用了StringRedisTemplate和RedisTemplate,而且對存儲String與存儲Java對象採用不一樣的Template進行了簡單的封裝。spring

首先是測試 保存與取出方法。分別用不一樣的template能夠完美經過。測試

而後在測試刪除的方法中,測試出現了問題。spa

問題以下:code

    在採用StringRedisTemplate進行保存的數據,用StringRedisTemplate去刪除能夠成功刪除。xml

    在採用RedisTemplate進行保存的數據,用RedisTemplate去刪除也能夠刪除成功。對象

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

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

由於,須要封裝一套通用的刪除方法,而且須要封裝一個批量刪除的方法。因此研究了下問題出現的緣由。hash

通過查看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>

這樣就能完美的刪除了。

這裏推薦將全部Template的key都採用String的序列化方式,而value的序列化方式能夠採用不一樣的序列化方式。

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

JacksonJsonRedisSerializer
Jackson2JsonRedisSerializer
OxmSerializer

等序列化方法,你們能夠分別採用各類序列化方式作一些試驗。

相關文章
相關標籤/搜索