淺談redis key值內(nèi)存消耗以及性能影響
一、redis key數(shù)量為1千萬時(shí)。
存儲(chǔ)value為"0",比較小。如果value較大,則存儲(chǔ)內(nèi)存會(huì)增多
redis key數(shù)量為一千萬時(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百萬時(shí)。
redis key數(shù)量為一千五百萬時(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ù)量為一千五百萬時(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千五百萬
使用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é)
可見,當(dāng)存儲(chǔ)量特別大的時(shí)候,可以將key進(jìn)行hash分散處理,可以減少存儲(chǔ)內(nèi)存。
并且當(dāng)key的數(shù)量很大的時(shí)候,redis取值性能還是很高的。
補(bǔ)充:Redis 單key值過大 優(yōu)化方式
Redis使用過程中經(jīng)常會(huì)有各種大key的情況, 比如:
1: 單個(gè)簡單的key存儲(chǔ)的value很大
2: hash, set,zset,list 中存儲(chǔ)過多的元素(以萬為單位)
由于redis是單線程運(yùn)行的,如果一次操作的value很大會(huì)對(duì)整個(gè)redis的響應(yīng)時(shí)間造成負(fù)面影響,所以,業(yè)務(wù)上能拆則拆,下面舉幾個(gè)典型的分拆方案。
1、單個(gè)簡單的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來獲取部分的value,使用hset,hmset來更新部分屬性
2、 hash, set,zset,list 中存儲(chǔ)過多的元素
類似于場(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í)間來分拆)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
springboot項(xiàng)目連接多種數(shù)據(jù)庫該如何操作詳析
在Spring Boot應(yīng)用中連接多個(gè)數(shù)據(jù)庫或數(shù)據(jù)源可以使用多種方式,下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目連接多種數(shù)據(jù)庫該如何操作的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
使用Mybatis Generator結(jié)合Ant腳本快速自動(dòng)生成Model、Mapper等文件的方法
這篇文章主要介紹了使用Mybatis Generator結(jié)合Ant腳本快速自動(dòng)生成Model、Mapper等文件的方法的相關(guān)資料,需要的朋友可以參考下2016-06-06
詳談Java編程之委托代理回調(diào)、內(nèi)部類以及匿名內(nèi)部類回調(diào)(閉包回調(diào))
下面小編就為大家?guī)硪黄斦凧ava編程之委托代理回調(diào)、內(nèi)部類以及匿名內(nèi)部類回調(diào)(閉包回調(diào))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
javax.validation.constraints注解使用
這篇文章主要介紹了javax.validation.constraints注解使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java CountDownLatch應(yīng)用場(chǎng)景代碼實(shí)例
這篇文章主要介紹了Java CountDownLatch應(yīng)用場(chǎng)景代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
淺析Java類和數(shù)據(jù)結(jié)構(gòu)中常用的方法
下面小編就為大家?guī)硪黄獪\析Java類和數(shù)據(jù)結(jié)構(gòu)中常用的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
Springboot項(xiàng)目中如何讓非Spring管理的類獲得一個(gè)注入的Bean
這篇文章主要介紹了Springboot項(xiàng)目中如何讓非Spring管理的類獲得一個(gè)注入的Bean問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
IDEA創(chuàng)建父項(xiàng)目和子項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了IDEA創(chuàng)建父項(xiàng)目和子項(xiàng)目的實(shí)現(xiàn)步驟,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Java類加載機(jī)制實(shí)現(xiàn)流程及原理詳解
這篇文章主要介紹了Java類加載機(jī)制實(shí)現(xiàn)流程及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

