目錄一、命令行刪除二、golang代碼刪除一、命令行刪除redis-cli-h172.18.255.99-p6379-n6-a123456KEYSwebsocket127.0.0....
一、命令行刪除
Redis-cli -h 172.18.255.99http://www.newsfordelhi.com -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 提供了一個簡單暴力的指令 keys 用來列出所有滿足特定正則字符串規則的 key。
注:這個指令使用非常簡單,提供一個簡單的正則字符串即可,但是有很明顯的兩個缺點。
- 沒有 offset、limit 參數,一次性吐出所有滿足條件的 key,萬一實例中有幾百 w 個 key 滿足條件,
- 當你看到滿屏的字符串刷的沒有盡頭時,你就知道難受了。
- keys 算法是遍歷算法,復雜度是 O(n),如果實例中有千萬級以上的 key,這個指令就會導致 Redis 服務卡頓,
- 所有讀寫 Redis 的其它的指令都會被延后甚至會超時報錯,
- 因為 Redis 是單線程程序,順序執行所有指令,其它指令必須等到當前的 keys 指令執行完了才可以繼續。
所以建議生產環境屏蔽keys命令
scan 相比 keys 具備有以下特點:
- 復雜度雖然也是 O(n),但是它是通過游標分步進行的,不會阻塞線程;
- 提供 limit 參數,可以控制每次返回結果的最大條FnEmmagvm數,limit 只是對增量式迭代命令的一種提示(hint),返回的結果可多可少;
- 同 keys 一樣,它也提供模式匹配功能;
- 服務器不需要為游標保存狀態,游標的唯一狀態就是 scan 返回給客戶端的游標整數;
- 返回的結果可能會有重復,需要客戶端去重復,這點非常重要;
- 遍歷的過程中如果有數據修改,改動后的數據能不能遍歷到是不確定的;
- 單次返回的結果是空的并不意味著遍歷結束,而要看返回的游標值是否為零
KEYS vs SCAN
一樣都會掃過所有的 key,scan 不會阻塞整個 server,而是迭代的收集結果
DEL vs UNLINK
一樣都是刪除 key ,差別在於 unlink 是非阻塞的刪除,會以非同步的方式回收android記憶體
所以對于一個大的key數量,我們可以借助sscan使用下邊的命令可以實現優雅的批量刪除:
redis-cli -h 172.18.255.99 -p 6379 --scan --pattern users:* | xargs redis-cli -h 172.18.255.99 -p 6379 unlink
- 用 scan 找出要刪的 key
- 透過 xargs 傳給 unlink 刪掉 key
(error) ERR unknown command 'unlink'
如果出現以上錯誤,說明redis版本不足,使用unlink需要Redis4版本
cluster 刪除數據
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(cont編程ext.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/
到此這篇關于redis模糊批量清除key的文章就介紹到這了,更多相關redis模糊刪除key內容請搜索我們以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持我們!
如果認為本文對您有所幫助請贊助本站