新聞中心
一、 什么是Redis大key
key存儲的value值非常大,當value為哈希表、集合、有序集或鏈表時指存儲的元素過多(上萬)。
當value為字符串時一般指單個字符串超過1M。
也包括Key數量極多的情況,例如key數量達到千萬上億的規模
二、大key會有哪些問題
由于Redis主線程為單線程模型,大key也會帶來一些問題,如:
1、集群模式在slot分片均勻情況下,會出現數據和查詢傾斜情況,部分有大key的Redis節點占用內存多,QPS高。
2、大key相關的刪除或者自動過期時,會出現qps突降或者突升的情況,極端情況下,會造成主從復制異常,Redis服務阻塞無法響應請求。大key的體積與刪除耗時可參考下表:
key類型 field數量耗時
Hash 100萬1000ms
List 100萬1000ms
Set 100萬1000ms
Sorted Set 100萬1000ms
del命令刪除集合類象時,時間復雜度為O(M),M為集合中元素個數
3、大key的操作,尤其是使用hgetall、lrange 0 -1、get、hmget 等操作時,網卡可能會成為瓶頸
三、大key發現、刪除
Redis4.0前
1、redis-rdb-tools工具。redis實例上執行bgsave,然后對dump出來的rdb文件進行分析,找到其中的大KEY。
2、redis-cli --bigkeys命令。可以找到某個實例5種數據類型(String、hash、list、set、zset)的最大key。
--bigkeys給出了每種數據結構的top 1 bigkey,同時給出了每種數據類型的鍵值個數以及平均大小
Redis 4.0后大key發現和刪除
memory usage命令和lazyfree機制
memory usage: 抽樣統計key大小
[root@*** ~]# > MEMORY USAGE key值
lazyfree機制:在刪除的時候只進行邏輯刪除,把key釋放操作放在bio(Background I/O)單獨的子線程處理中,減少刪除大key對redis主線程的阻塞
當刪除key滿足閾值條件時,會將key放入BIO_LAZY_FREE后臺線程任務隊列
lazyfree有兩種方式
1.主動刪除
使用UN命令,集合個數大于64個后采用后臺線程刪除
2.被動刪除
需要做配置,默認是關閉的
lazyfree-lazy-eviction 達到最大內存淘汰時
lazyfree-lazy-expire 過期鍵刪除策略
lazyfree-lazy-server-del 針對有些指令在處理已存在的鍵時,會帶有一個隱式的DEL鍵的操作。如rename命令,當目標鍵已存在,redis會先刪除目標鍵
slave-lazy-flush 針對slave進行全量數據同步,slave在加載master的RDB文件前,會運行flushall來清理自己的數據場景
四、大key處理方式
哈希、集合、有序集合、鏈表中元素數量過多
拆分多個小集合,比如使用key計算出一個hash值,然后存到 key+hash值對應的value中
存儲的key過多
減少key個數可以減少對內存的消耗,可以參考hash結構存儲,將多個key存儲在一個hash結構中。
字符串類型單key的value過大
將value拆分,降低單次操作的對服務端帶來壓力
Redis其他
redis可以存多少key
redis最多可以處理 2^32個可以,每個實例可以處理2.5億
每個哈希、列表、集合最多可容納2^32
Redis內存占用
●一個空實例將使用約3MB的內存。
●1百萬個小鍵->字符串值對使用?85MB的內存。
1百萬個鍵->哈希值,代表具有5個字段的對象,使