欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談redis key值內存消耗以及性能影響

 更新時間:2021年02月07日 15:28:41   作者:Dark_King_  
這篇文章主要介紹了淺談redis key值內存消耗以及性能影響,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一、redis key數量為1千萬時。

存儲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千5百萬時。

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 key數量為一千五百萬時壓測

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

四、使用map將key值打散存儲,小key為1千五百萬

使用hset存儲打散為1024個key時,存儲大小為921M,比直接存儲節(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存儲打散為256個key

存儲大小為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

六、進行hget的壓力測試

 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值過大 優(yōu)化方式

Redis使用過程中經常會有各種大key的情況, 比如:

1: 單個簡單的key存儲的value很大

2: hash, set,zset,list 中存儲過多的元素(以萬為單位)

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

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)

現(xiàn)在,固定一個桶的數量,比如 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按照時間來分拆)。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • java實現(xiàn)對Hadoop的操作

    java實現(xiàn)對Hadoop的操作

    這篇文章主要介紹了java實現(xiàn)對Hadoop的操作,通過非常完整詳細的代碼展示了如何去進行一系列操作,包括基本操作,文件讀寫,需要的朋友可以參考下
    2021-07-07
  • Spring?Boot獲取resources目錄下的文件三種方式詳解

    Spring?Boot獲取resources目錄下的文件三種方式詳解

    在Spring?Boot項目中,經常需要獲取resources目錄下的文件,這些文件可以包括配置文件、模板文件、靜態(tài)資源等,這篇文章主要介紹了Spring?Boot獲取resources目錄下的文件的三種方式,需要的朋友可以參考下
    2023-06-06
  • Java第三方庫JodaTime的具體使用

    Java第三方庫JodaTime的具體使用

    本文主要介紹了Java第三方庫JodaTime的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java的ArrayList擴容源碼解析

    Java的ArrayList擴容源碼解析

    這篇文章主要介紹了Java的ArrayList擴容源碼解析,通過動態(tài)擴容,ArrayList能夠在添加元素時保持高效的性能,擴容操作是有一定開銷的,但由于擴容的時間復雜度為O(n),其中n是當前元素個數,所以平均情況下,每次添加元素的時間復雜度仍然是O(1),需要的朋友可以參考下
    2024-01-01
  • 談談變量命名規(guī)范的重要性

    談談變量命名規(guī)范的重要性

    下面小編就為大家?guī)硪黄務勛兞棵?guī)范的重要性。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • SpringBoot集成支付寶沙箱支付的實現(xiàn)示例

    SpringBoot集成支付寶沙箱支付的實現(xiàn)示例

    本文主要介紹了SpringBoot集成支付寶沙箱支付的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 深入理解Java對象復制

    深入理解Java對象復制

    使用任何已有的工具,都沒有直接使用 get set 方式進行,對象轉換的速度快,雖然get set 方式代碼對一些比較麻煩,但是效率要高一些的,推薦使用 MapStruct 方式.,需要的朋友可以參考下
    2021-05-05
  • Java使用ScriptEngine動態(tài)執(zhí)行代碼(附Java幾種動態(tài)執(zhí)行代碼比較)

    Java使用ScriptEngine動態(tài)執(zhí)行代碼(附Java幾種動態(tài)執(zhí)行代碼比較)

    這篇文章主要介紹了Java使用ScriptEngine動態(tài)執(zhí)行代碼,并且分享Java幾種動態(tài)執(zhí)行代碼比較,需要的朋友可以參考下
    2021-04-04
  • Spring-boot JMS 發(fā)送消息慢的解決方法

    Spring-boot JMS 發(fā)送消息慢的解決方法

    這篇文章主要為大家詳細介紹了Spring-boot JMS 發(fā)送消息慢的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • MyBatisPlus代碼生成器的原理及實現(xiàn)詳解

    MyBatisPlus代碼生成器的原理及實現(xiàn)詳解

    這篇文章主要為大家詳細介紹了MyBatisPlus中代碼生成器的原理及實現(xiàn),文中的示例代碼講解詳細,對我們學習MyBatisPlus有一定幫助,需要的可以參考一下
    2022-08-08

最新評論