spring-data-redis 使用過程當中踩過的坑

spring-data-redis簡介

Spring-data-redis是spring你們族的一部分,提供了在srping應用中經過簡單的配置訪問redis服務,對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝,RedisTemplate提供了redis各類操做、異常處理及序列化,支持發佈訂閱,並對spring 3.1 cache進行了實現。javascript

spring-data-redis針對jedis提供了以下功能:java

  • 鏈接池自動管理,提供了一個高度封裝的「RedisTemplate」類
  • 針對jedis客戶端中大量api進行了歸類封裝,將同一類型操做封裝爲operation接口
  • ValueOperations:簡單K-V操做
  • SetOperations:set類型數據操做
  • ZSetOperations:zset類型數據操做
  • HashOperations:針對map類型的數據操做
  • ListOperations:針對list類型的數據操做

踩坑1:序列化問題

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

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

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

就是由於序列化策略的不一樣,即便是同一個key用不一樣的Template去序列化,結果是不一樣的。因此根據key去操做數據的時候就出現了操做失敗的問題。ui

<bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" /> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="keySerializer" ref="stringRedisSerializer" /> <property name="hashKeySerializer" ref="stringRedisSerializer" /> <property name="valueSerializer" ref="stringRedisSerializer"/> </bean> 

建議:
redis 序列化策略 ,建議採用String序列化策略spa

踩坑2:設置一個鍵值及其過時時間

錯誤的設置方式:code

/** * Overwrite parts of {@code key} starting at the specified {@code offset} with given {@code value}. * * @param key must not be {@literal null}. * @param value * @param offset * @see <a href="http://redis.io/commands/setrange">Redis Documentation: SETRANGE</a> */ void set(K key, V value, long offset); 

正確的設置方式:xml

/** * Set the {@code value} and expiration {@code timeout} for {@code key}. * * @param key must not be {@literal null}. * @param value * @param timeout * @param unit must not be {@literal null}. * @see <a href="http://redis.io/commands/setex">Redis Documentation: SETEX</a> */ void set(K key, V value, long timeout, TimeUnit unit); 

踩坑3:模糊刪除

錯誤的方式1:blog

Set<String> keys=redisTemplate.keys(prex+"*"); for test Iterator<String> it=keys.iterator(); while(it.hasNext()){ redisTemplate.delete((String)it.next()); } 

錯誤的方式2:

Set<String> keys=redisTemplate.keys(prex+"*"); redisTemplate.delete(keys); 

在鍵值較多的時候,keys查詢會block住。

建議在鍵值較多的時候,一般指百萬以上級別,能夠使用scan命令進行分頁刪除。

相關文章
相關標籤/搜索