深入理解Redis BigKey
MoreKey
大批量往redis里面插入2000W測試數(shù)據key
- LinuxBash下面執(zhí)行,插入100w數(shù)據腳本
# 生成100W條redis批量設置kv的語句(key=kn,value=vn)寫入到/tmp目錄下的redisTest.txt文件中 for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ; done;
- 通過Redis提供的管道–pipe命令插入100W大批量數(shù)據
結合自己機器的地址:
cat /tmp/redisTest.txt | redis-cli -h 127.0.0.1 -p 6379 -a 111111 --pipe
嘗試keys * 花費時間
key * 這個指令有致命的弊端,在實際環(huán)境中最好不要使用
生產上限制keys */flushdb/flushall等危險命令以防止誤刪誤用
通過配置設置禁用這些命令,redistribution。conf在SECURITY這一項中
SCAN命令
1.語法
? 2.特點
? Redis Scan命令基本語法如下:
SCAN cursor [MATCH pattern] [COUNT count]
? cursor -游標
? pattern -匹配的模式
? count -指定從數(shù)據集里返回多少元素,默認值為10。
SCAN 命令是一個基于游標的迭代器,每次被調用之后, 都會向用戶返回一個新的游標, 用戶在下次迭代時需要使用這個新游標作為 SCAN 命令的游標參數(shù), 以此來延續(xù)之前的迭代過程。
SCAN 返回一個包含兩個元素的數(shù)組,
第一個元素是用于進行下一次迭代的新游標,
第二個元素則是一個數(shù)組, 這個數(shù)組中包含了所有被迭代的元素。如果新游標返回零表示迭代已結束。
SCAN的遍歷順序
非常特別,它不是從第一維數(shù)組的第零位一直遍歷到末尾,而是采用了高位進位加法來遍歷。之所以使用這樣特殊的方式進行遍歷,是考慮到字典的擴容和縮容時避免槽位的遍歷重復和遺漏。
? 3.使用
BigKey
多大算Big
參考《阿里云Redis開發(fā)規(guī)范》
string和二級結構
string是value,最大512MB但是≥10KB就是bigkey
list、hash、set和zset,個數(shù)超過5000就是bigkey
? List:一個列表最多可以包含2^32-1個元素(4294967295,每個列表超過40億個元素)。
? hash:Redis中每個hash可以存儲2^32-1鍵值對(40多億)
? set:集合中最大的成員數(shù)為2^32-1 (4294967295,每個集合可存儲40多億個成員)。
? …
危害
1.內存不均,集群遷移困難
2.超時刪除,大key刪除作梗
3.網絡流量阻塞
找出BigKey
redis-cli --bigkeys
好處
給出每種數(shù)據結構Top 1 bigkey,同時給出每種數(shù)據類型的鍵值個數(shù)+平均大小
不足
想查詢大于10kb的所有key,–bigkeys參數(shù)就無能為力了,需要用到memory usage來計算每個鍵值的字節(jié)數(shù)
redis-cli --bigkeys -a 111111
redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys 每隔 100 條 scan 指令就會休眠 0.1s,ops 就不會劇烈抬升,但是掃描的時間會變長redis-cli -h 127.0.0.1 -p 7001 –-bigkeys -i 0.1
MEMORY USAGE 鍵
如何刪除
String
一般用del,如果過于龐大unlink
hash
使用hscan每次獲取少量field-value,再使用hdel刪除每個field
list
使用ltrim漸進式逐步刪除,直到全部刪除完成
set
使用sscan每次獲取部分元素,再使用srem命令刪除每個元素
Zset
使用zscan每次獲取部分元素,再使用ZREMRANGEBYRANK命令刪除每個元素
BigKey生產調優(yōu)
redis.conf配置文件LAZY FREEING相關說明
阻塞和非阻塞刪除命令
優(yōu)化配置
到此這篇關于深入理解Redis BigKey的文章就介紹到這了,更多相關Redis BigKey內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!