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