
Redis使用過程中經(jīng)常會(huì)有各種大key的情況, 比如:
- 1: 單個(gè)簡單的key存儲(chǔ)的value很大
- 2: hash, set,zset,list 中存儲(chǔ)過多的元素(以萬為單位)
由于redis是單線程運(yùn)行的,如果一次操作的value很大會(huì)對整個(gè)redis的響應(yīng)時(shí)間造成負(fù)面影響,所以,業(yè)務(wù)上能拆則拆,下面舉幾個(gè)典型的分拆方案。
1、單個(gè)簡單的key存儲(chǔ)的value很大
1.1、 改對象需要每次都整存整取
可以嘗試將對象分拆成幾個(gè)key-value, 使用multiGet獲取值,這樣分拆的意義在于分拆單次操作的壓力,將操作壓力平攤到多個(gè)redis實(shí)例中,降低對單個(gè)redis的IO影響;
1.2、該對象每次只需要存取部分?jǐn)?shù)據(jù)
可以像第一種做法一樣,分拆成幾個(gè)key-value, 也可以將這個(gè)存儲(chǔ)在一個(gè)hash中,每個(gè)field代表一個(gè)具體的屬性,使用hget,hmget來獲取部分的value,使用hset,hmset來更新部分屬性
2、 hash, set,zset,list 中存儲(chǔ)過多的元素
類似于場景一種的第一個(gè)做法,可以將這些元素分拆。
以hash為例,原先的正常存取流程是 hget(hashKey, field) ; hset(hashKey, field, value)
現(xiàn)在,固定一個(gè)桶的數(shù)量,比如 10000, 每次存取的時(shí)候,先在本地計(jì)算field的hash值,模除 10000, 確定了該field落在哪個(gè)key上。
newHashKey = hashKey + (*hash*(field) % 10000);
hset (newHashKey, field, value) ;
hget(newHashKey, field)
set, zset, list 也可以類似上述做法.
但有些不適合的場景,比如,要保證 lpop 的數(shù)據(jù)的確是最早push到list中去的,這個(gè)就需要一些附加的屬性,或者是在 key的拼接上做一些工作(比如list按照時(shí)間來分拆)。
個(gè)人介紹:
高廣超:多年一線互聯(lián)網(wǎng)研發(fā)與架構(gòu)設(shè)計(jì)經(jīng)驗(yàn),擅長設(shè)計(jì)與落地高可用、高性能、可擴(kuò)展的互聯(lián)網(wǎng)架構(gòu)。
本文首發(fā)在http://www.itdecent.cn/u/2766e4cfc391)轉(zhuǎn)載請注明!