天天看點

Redis 單key值過大 優化方式

Redis 單key值過大 優化方式

image.png

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按照時間來分拆)。

個人介紹:

高廣超:多年一線網際網路研發與架構設計經驗,擅長設計與落地高可用、高性能、可擴充的網際網路架構。

本文首發在

高廣超的簡書部落格

轉載請注明!

Redis 單key值過大 優化方式

簡書部落格

Redis 單key值過大 優化方式

頭條号

繼續閱讀