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按照時間來分拆)。
個人介紹: 高廣超:多年一線互聯網研發與架構設計經驗,擅長設計與落地高可用、高性能、可擴展的互聯網架構。