日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

key redis 遍历_快乐运维Redis大数据量查询与清理

發(fā)布時(shí)間:2024/9/27 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 key redis 遍历_快乐运维Redis大数据量查询与清理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。