Redis 單key值過大 優化方式

Redis使用過程中經常會有各種大key的情況, 比如:

  • 1: 單個簡單的key存儲的value很大
  • 2: hash, set,zset,list 中存儲過多的元素(以萬爲單位)

由於redis是單線程運行的,如果一次操作的value很大會對整個redis的響應時間造成負面影響,所以,業務上能拆則拆,下面舉幾個典型的分拆方案。

1、單個簡單的key存儲的value很大

1.1、 改對象需要每次都整存整取

可以嘗試將對象分拆成幾個key-value, 使用multiGet獲取值,這樣分拆的意義在於分拆單次操作的壓力,將操作壓力平攤到多個redis實例中,降低對單個redis的IO影響;

1.2、該對象每次只需要存取部分數據

可以像第一種做法一樣,分拆成幾個key-value, 也可以將這個存儲在一個hash中,每個field代表一個具體的屬性,使用hget,hmget來獲取部分的value,使用hset,hmset來更新部分屬性


2、 hash, set,zset,list 中存儲過多的元素

類似於場景一種的第一個做法,可以將這些元素分拆。

以hash爲例,原先的正常存取流程是 hget(hashKey, field) ; hset(hashKey, field, value) 現在,固定一個桶的數量,比如 10000, 每次存取的時候,先在本地計算field的hash值,模除 10000, 確定了該field落在哪個key上。

newHashKey  =  hashKey + (*hash*(field) % 10000);   
hset (newHashKey, field, value) ;  
hget(newHashKey, field)

set, zset, list 也可以類似上述做法.

但有些不適合的場景,比如,要保證 lpop 的數據的確是最早push到list中去的,這個就需要一些附加的屬性,或者是在 key的拼接上做一些工作(比如list按照時間來分拆)。


個人介紹: 高廣超:多年一線互聯網研發與架構設計經驗,擅長設計與落地高可用、高性能、可擴展的互聯網架構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章