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按照時間來分拆)。
個人介紹:
高廣超:多年一線網際網路研發與架構設計經驗,擅長設計與落地高可用、高性能、可擴充的網際網路架構。
本文首發在
高廣超的簡書部落格轉載請注明!
簡書部落格
頭條号