溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redis中key值會(huì)影響性能嗎

發(fā)布時(shí)間:2021-02-07 18:20:55 來(lái)源:億速云 閱讀:1125 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)redis中key值會(huì)影響性能嗎,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

一、redis key數(shù)量為1千萬(wàn)時(shí)。

存儲(chǔ)value為"0",比較小。如果value較大,則存儲(chǔ)內(nèi)存會(huì)增多

redis key數(shù)量為一千萬(wàn)時(shí),使用了865M的內(nèi)存。

# Keyspace
db0:keys=11100111,expires=0,avg_ttl=0
內(nèi)存使用情況
# Memory
used_memory:907730088
used_memory_human:865.68M
used_memory_rss:979476480
used_memory_rss_human:934.10M
used_memory_peak:1258244232
used_memory_peak_human:1.17G
used_memory_peak_perc:72.14%
used_memory_overhead:580102896
used_memory_startup:765664
used_memory_dataset:327627192
used_memory_dataset_perc:36.12%
total_system_memory:8365256704
total_system_memory_human:7.79G
used_memory_lua:37888
used_memory_lua_human:37.00K

二、redis key數(shù)量為1千5百萬(wàn)時(shí)。

redis key數(shù)量為一千五百萬(wàn)時(shí),使用了1.13G的內(nèi)存。

# Keyspace
db0:keys=15100031,expires=0,avg_ttl=0
# Memory
used_memory:1211733288
used_memory_human:1.13G
used_memory_rss:1247817728
used_memory_rss_human:1.16G
used_memory_peak:1258244232
used_memory_peak_human:1.17G
used_memory_peak_perc:96.30%
used_memory_overhead:740104496
used_memory_startup:765664
used_memory_dataset:471628792
used_memory_dataset_perc:38.95%
total_system_memory:8365256704
total_system_memory_human:7.79G
used_memory_lua:37888
used_memory_lua_human:37.00K

三、redis key數(shù)量為一千五百萬(wàn)時(shí)壓測(cè)

redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 10000 -t get -q
GET: 34364.26 requests per second

四、使用map將key值打散存儲(chǔ),小key為1千五百萬(wàn)

使用hset存儲(chǔ)打散為1024個(gè)key時(shí),存儲(chǔ)大小為921M,比直接存儲(chǔ)節(jié)省了200M。

# Memory
used_memory:966758968
used_memory_human:921.97M
used_memory_rss:1002913792
used_memory_rss_human:956.45M
used_memory_peak:1749456304
used_memory_peak_human:1.63G
used_memory_peak_perc:55.26%
used_memory_overhead:1929880
used_memory_startup:765664
used_memory_dataset:964829088
used_memory_dataset_perc:99.88%
total_system_memory:8365256704
total_system_memory_human:7.79G
used_memory_lua:37888
used_memory_lua_human:37.00K 
# Keyspace
db0:keys=1024,expires=0,avg_ttl=0

五、使用hset存儲(chǔ)打散為256個(gè)key

存儲(chǔ)大小為1.09G,比直接存儲(chǔ)小了80M。

used_memory:1170356864
used_memory_human:1.09G
used_memory_rss:1190223872
used_memory_rss_human:1.11G
used_memory_peak:1749456304
used_memory_peak_human:1.63G
used_memory_peak_perc:66.90%
used_memory_overhead:33759246
used_memory_startup:765664
used_memory_dataset:1136597618
used_memory_dataset_perc:97.18%
total_system_memory:8365256704
total_system_memory_human:7.79G

六、進(jìn)行hget的壓力測(cè)試

 redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 10000 -t hget myhash rand_int rand_int rand_int 
====== myhash rand_int rand_int rand_int ======
 10000 requests completed in 0.22 seconds
 1000 parallel clients
 3 bytes payload
 keep alive: 1 
46511.63 requests per second

七、總結(jié)

可見(jiàn),當(dāng)存儲(chǔ)量特別大的時(shí)候,可以將key進(jìn)行hash分散處理,可以減少存儲(chǔ)內(nèi)存。

并且當(dāng)key的數(shù)量很大的時(shí)候,redis取值性能還是很高的。

補(bǔ)充:Redis 單key值過(guò)大 優(yōu)化方式

Redis使用過(guò)程中經(jīng)常會(huì)有各種大key的情況, 比如:

1: 單個(gè)簡(jiǎn)單的key存儲(chǔ)的value很大

2: hash, set,zset,list 中存儲(chǔ)過(guò)多的元素(以萬(wàn)為單位)

由于redis是單線程運(yùn)行的,如果一次操作的value很大會(huì)對(duì)整個(gè)redis的響應(yīng)時(shí)間造成負(fù)面影響,所以,業(yè)務(wù)上能拆則拆,下面舉幾個(gè)典型的分拆方案。

1、單個(gè)簡(jiǎn)單的key存儲(chǔ)的value很大

1.1、 改對(duì)象需要每次都整存整取

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

1.2、該對(duì)象每次只需要存取部分?jǐn)?shù)據(jù)

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

2、 hash, set,zset,list 中存儲(chǔ)過(guò)多的元素

類似于場(chǎng)景一種的第一個(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 也可以類似上述做法.

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

關(guān)于redis中key值會(huì)影響性能嗎就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI