這篇文章將為大家詳細講解有關redis中key值會影響性能嗎,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
存儲value為"0",比較小。如果value較大,則存儲內存會增多
redis key數量為一千萬時,使用了865M的內存。
# Keyspace db0:keys=11100111,expires=0,avg_ttl=0 內存使用情況 # 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數量為一千五百萬時,使用了1.13G的內存。
# 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-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 10000 -t get -q GET: 34364.26 requests per second
使用hset存儲打散為1024個key時,存儲大小為921M,比直接存儲節省了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
存儲大小為1.09G,比直接存儲小了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
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
可見,當存儲量特別大的時候,可以將key進行hash分散處理,可以減少存儲內存。
并且當key的數量很大的時候,redis取值性能還是很高的。
補充:Redis 單key值過大 優化方式
Redis使用過程中經常會有各種大key的情況, 比如:
1: 單個簡單的key存儲的value很大
2: hash, set,zset,list 中存儲過多的元素(以萬為單位)
由于redis是單線程運行的,如果一次操作的value很大會對整個redis的響應時間造成負面影響,所以,業務上能拆則拆,下面舉幾個典型的分拆方案。
可以嘗試將對象分拆成幾個key-value, 使用multiGet獲取值,這樣分拆的意義在于分拆單次操作的壓力,將操作壓力平攤到多個redis實例中,降低對單個redis的IO影響;
可以像第一種做法一樣,分拆成幾個key-value, 也可以將這個存儲在一個hash中,每個field代表一個具體的屬性,使用hget,hmget來獲取部分的value,使用hset,hmset來更新部分屬性
類似于場景一種的第一個做法,可以將這些元素分拆。
以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值會影響性能嗎就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。