key redis 遍历_快乐运维Redis大数据量查询与清理
一、 keys命令(生產(chǎn)環(huán)境禁止使用)
簡(jiǎn)單粗暴,由于Redis單線程這一特性,keys命令是以阻塞的方式執(zhí)行的,keys是以遍歷的方式實(shí)現(xiàn)的復(fù)雜度是 O(n),Redis庫(kù)中的key越多,查找實(shí)現(xiàn)代價(jià)越大,產(chǎn)生的阻塞時(shí)間越長(zhǎng)。
keys * 、keys codehole* 分別是查詢?nèi)康膋ey以及查詢前綴為codehole的key。特點(diǎn)太暴力,性能不好,搜索的是整個(gè)redis;
缺點(diǎn):
1、沒(méi)有 offset、limit 參數(shù),一次性吐出所有滿足條件的 key,萬(wàn)一實(shí)例中有幾百 w 個(gè) key 滿足條件,當(dāng)你看到滿屏的字符串刷的沒(méi)有盡頭時(shí),你就知道難受了。
2、keys 算法是遍歷算法,復(fù)雜度是 O(n),如果實(shí)例中有千萬(wàn)級(jí)以上的 key,這個(gè)指令就會(huì)導(dǎo)致 Redis 服務(wù)卡頓,所有讀寫(xiě) Redis 的其它的指令都會(huì)被延后甚至?xí)瑫r(shí)報(bào)錯(cuò),因?yàn)?Redis 是單線程程序,順序執(zhí)行所有指令,其它指令必須等到當(dāng)前的 keys 指令執(zhí)行完了才可以繼續(xù)。
redis的keys命令,通常在用來(lái)刪除相關(guān)的key時(shí)使用,但這個(gè)命令有一個(gè)弊端,在redis擁有數(shù)百萬(wàn)及以上的keys的時(shí)候,會(huì)執(zhí)行的比較慢,更為致命的是,這個(gè)命令會(huì)阻塞redis多路復(fù)用的io主線程,如果這個(gè)線程阻塞,在此執(zhí)行之間其他的發(fā)送向redis服務(wù)端的命令,都會(huì)阻塞,從而引發(fā)一系列級(jí)聯(lián)反應(yīng),導(dǎo)致瞬間響應(yīng)卡頓,從而引發(fā)超時(shí)等問(wèn)題,所以應(yīng)該在生產(chǎn)環(huán)境禁止用使用keys和類似的命令smembers,這種時(shí)間復(fù)雜度為O(N),且會(huì)阻塞主線程的命令,是非常危險(xiǎn)的。
所以我們通常在生產(chǎn)環(huán)境數(shù)據(jù)量較大的時(shí)候,會(huì)選擇將keys命令做重命名,禁止誤操作。
rename-command KEYS ? ? ""
官方解釋:https://redis.io/commands/KEYS
二、 scan命令(生產(chǎn)環(huán)境推薦使用)
以非阻塞的方式實(shí)現(xiàn)key值的查找,絕大多數(shù)情況下是可以替代keys命令的,可選性更強(qiáng)
scan命令的特點(diǎn):
1、復(fù)雜度雖然也是 O(n),但是它是通過(guò)游標(biāo)分步進(jìn)行的,不會(huì)阻塞線程;
2、提供 limit 參數(shù),可以控制每次返回結(jié)果的最大條數(shù),limit 只是一個(gè) hint,返回的結(jié)果可多可少;
3、同 keys 一樣,它也提供模式匹配功能;
4、服務(wù)器不需要為游標(biāo)保存狀態(tài),游標(biāo)的唯一狀態(tài)就是 scan 返回給客戶端的游標(biāo)整數(shù);
5、返回的結(jié)果可能會(huì)有重復(fù),需要客戶端去重復(fù),這點(diǎn)非常重要;
正常情況下,使用scan沒(méi)問(wèn)題,如果正在rehash,則會(huì)造成重讀
比如現(xiàn)在有四個(gè)桶,讀了0,1,發(fā)生rehash時(shí), 0會(huì)到4上,1是到5,造成重讀,
redis使用高位遞增遍歷,如下, 當(dāng)02,遍歷完以后0426肯定是遍歷完的
但縮容有可能發(fā)成key重復(fù)。
6、遍歷的過(guò)程中如果有數(shù)據(jù)修改,改動(dòng)后的數(shù)據(jù)能不能遍歷到是不確定的;
7、單次返回的結(jié)果是空的并不意味著遍歷結(jié)束,而要看返回的游標(biāo)值是否為零
? ? ? ? ?Examples:
? ? ? ? ? redis-cli -p 6379 -a password?--scan --pattern "name*"
三、DEL命令(生產(chǎn)環(huán)境禁止使用)
DEL?key [key ...]
刪除指定的一批keys,如果刪除中的某些key不存在,則直接忽略。
返回值
integer-reply:被刪除的keys的數(shù)量
? ? ? ? ?Examples
DEL始終在阻止模式下釋放值部分.但是,如果該值太大,例如對(duì)于大型LIST或HASH的分配太多,它會(huì)長(zhǎng)時(shí)間阻止Redis.
四、unlink 命令(生產(chǎn)環(huán)境推薦使用)
unlink?key [key ...]
該命令和DEL十分相似:刪除指定的key(s),若key不存在則該key被跳過(guò)。但是,相比DEL會(huì)產(chǎn)生阻塞,該命令會(huì)在另一個(gè)線程中回收內(nèi)存,因此它是非阻塞的。這也是該命令名字的由來(lái):僅將keys從keyspace元數(shù)據(jù)中刪除,真正的刪除會(huì)在后續(xù)異步操作。
返回值
integer-reply:unlink的keys的數(shù)量.
? ? ? ? Examples
復(fù)合查詢刪除使用樣例:
模糊匹配要查詢的KEY:
redis-cli -p 6379?-a password --scan --pattern "name*"
將剛剛模糊匹配的KEY異步刪除:
redis-cli -p?6379?-a?password?--scan --pattern "name*"|xargs -L 2000 redis-cli -p 6379 -a password unlink
總結(jié)
以上是生活随笔為你收集整理的key redis 遍历_快乐运维Redis大数据量查询与清理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何在家里自己制作烤鹌鹑?
- 下一篇: apache1.3 php编译,安装Ap