redis模糊批量刪除key的方法
一、命令行刪除
redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 KEYS "websocket127.0.0.1:5*" | xargs redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 DEL
- -h:redis地址
- -p:redis端口
- -n:reids庫
- -a:redis密碼
Redis 提供了一個(gè)簡單暴力的指令 keys 用來列出所有滿足特定正則字符串規(guī)則的 key。
注:這個(gè)指令使用非常簡單,提供一個(gè)簡單的正則字符串即可,但是有很明顯的兩個(gè)缺點(diǎn)。
- 沒有 offset、limit 參數(shù),一次性吐出所有滿足條件的 key,萬一實(shí)例中有幾百 w 個(gè) key 滿足條件,
- 當(dāng)你看到滿屏的字符串刷的沒有盡頭時(shí),你就知道難受了。
- keys 算法是遍歷算法,復(fù)雜度是 O(n),如果實(shí)例中有千萬級(jí)以上的 key,這個(gè)指令就會(huì)導(dǎo)致 Redis 服務(wù)卡頓,
- 所有讀寫 Redis 的其它的指令都會(huì)被延后甚至?xí)瑫r(shí)報(bào)錯(cuò),
- 因?yàn)?Redis 是單線程程序,順序執(zhí)行所有指令,其它指令必須等到當(dāng)前的 keys 指令執(zhí)行完了才可以繼續(xù)。
所以建議生產(chǎn)環(huán)境屏蔽keys命令
scan 相比 keys 具備有以下特點(diǎn):
- 復(fù)雜度雖然也是 O(n),但是它是通過游標(biāo)分步進(jìn)行的,不會(huì)阻塞線程;
- 提供 limit 參數(shù),可以控制每次返回結(jié)果的最大條數(shù),limit 只是對(duì)增量式迭代命令的一種提示(hint),返回的結(jié)果可多可少;
- 同 keys 一樣,它也提供模式匹配功能;
- 服務(wù)器不需要為游標(biāo)保存狀態(tài),游標(biāo)的唯一狀態(tài)就是 scan 返回給客戶端的游標(biāo)整數(shù);
- 返回的結(jié)果可能會(huì)有重復(fù),需要客戶端去重復(fù),這點(diǎn)非常重要;
- 遍歷的過程中如果有數(shù)據(jù)修改,改動(dòng)后的數(shù)據(jù)能不能遍歷到是不確定的;
- 單次返回的結(jié)果是空的并不意味著遍歷結(jié)束,而要看返回的游標(biāo)值是否為零
KEYS vs SCAN
一樣都會(huì)掃過所有的 key,scan 不會(huì)阻塞整個(gè) server,而是迭代的收集結(jié)果
DEL vs UNLINK
一樣都是刪除 key ,差別在於 unlink 是非阻塞的刪除,會(huì)以非同步的方式回收記憶體
所以對(duì)于一個(gè)大的key數(shù)量,我們可以借助sscan使用下邊的命令可以實(shí)現(xiàn)優(yōu)雅的批量刪除:
redis-cli -h 172.18.255.99 -p 6379 --scan --pattern users:* | xargs redis-cli -h 172.18.255.99 -p 6379 unlink
- 用 scan 找出要?jiǎng)h的 key
- 透過 xargs 傳給 unlink 刪掉 key
(error) ERR unknown command 'unlink'
如果出現(xiàn)以上錯(cuò)誤,說明redis版本不足,使用unlink需要Redis4版本
cluster 刪除數(shù)據(jù)
redis-cli -c -p 7000 --scan --pattern "age_*" | xargs -L 1 redis-cli -c -p 7000 -n 0 unlink
遍歷redis cluster各分片刪除
for port in {7000..7005}; do redis-cli -c -p ${port} -h 192.168.31.181 --scan --pattern "age_*" | xargs -L 1 redis-cli -h 192.168.31.181 -c -p ${port} -n 0 unlink done
二、golang代碼刪除
func DeleteRedisKeys(key string) { traceId := libra.GenTraceId(context.Background(), nil) ctx := libra.SetTraceId(context.Background(), traceId) //模糊查詢所有符合條件的key websocketKeys, _ := commons.GetRedisClient().Keys(ctx, key+"*").Result() if reflect.TypeOf(websocketKeys).Kind() == reflect.Slice { val := reflect.ValueOf(websocketKeys) if val.Len() == 0 { return } // 批量刪除key for i := 0; i < val.Len(); i++ { _, err := commons.GetRedisClient().Del(ctx, val.Index(i).Interface().(string)).Result() dlog.Errorf("DeleteKeys addr:=%v,err=%v", addr, err) } } }
參考文檔:
Redis SCAN的使用:http://jinguoxing.github.io/redis/2018/09/04/redis-scan/
到此這篇關(guān)于redis模糊批量清除key的文章就介紹到這了,更多相關(guān)redis模糊刪除key內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis安裝和配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08redis中hiredis-API函數(shù)的調(diào)用方法
這篇文章主要介紹了redis中hiredis-API函數(shù)的調(diào)用,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-09-09查看redis占用內(nèi)存的實(shí)現(xiàn)方法
這篇文章主要介紹了查看redis占用內(nèi)存的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Redis高并發(fā)緩存設(shè)計(jì)問題與性能優(yōu)化
本文詳細(xì)介紹了Redis緩存設(shè)計(jì)中常見的問題及解決方案,包括緩存穿透、緩存失效(擊穿)、緩存雪崩、熱點(diǎn)緩存key重建優(yōu)化、緩存與數(shù)據(jù)庫雙寫不一致以及開發(fā)規(guī)范與性能優(yōu)化,感興趣的可以了解一下2024-11-11Redis實(shí)現(xiàn)主從復(fù)制方式(Master&Slave)
這篇文章主要介紹了Redis實(shí)現(xiàn)主從復(fù)制方式(Master&Slave),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06如何使用gradle將java項(xiàng)目推送至maven中央倉庫
本文主要介紹了使用gradle將java項(xiàng)目推送至maven中央倉庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解
在Spring Cloud項(xiàng)目中,使用Java和Redis結(jié)合實(shí)現(xiàn)的分布式鎖可以確保訂單的一致性和并發(fā)控制,通過合理使用鎖的粒度以及注意事項(xiàng),可以減少死鎖問題并提高系統(tǒng)的并發(fā)性能,這篇文章主要介紹了Redis SETNX命令在Spring Cloud中的分布式鎖用法詳解,需要的朋友可以參考下2023-10-10