redis集群批量刪除指定的key

2021-08-21 03:57:49 字數 1773 閱讀 8857

工作中遇到乙個問題,redis中儲存了大量的key,而且沒有設定時效,其中很大一部分後來都沒用了,導致redis體積龐大,查詢緩慢。伺服器版本為windows,網上搜尋到很多批量刪除的方法都是linux下的,幾番尋找,終於找到了在windows下批量刪除超大量key的方法。

首先貼一下linux下的方法:

redis-cli keys"*" |xargs redis-cli del
//如果redis-cli沒有設定成系統變數,需要指定redis-cli的完整路徑,加入redis-cli的安裝路徑如下:

那麼在gitbash上模擬的linux命令則如下:

./redis-cli keys "*lz*"|xargs ./redis-cli del
原理就是通過xargs工具將前半部分的查詢結果借助管道傳遞給後面的刪除命令,進而實現迴圈刪除,達到批量刪除的結果。

but,測試的時候趣發現這條命令不好使,測試結果如下圖所示,具體的原因不明:

作為替代方案,我找到了windows、linux下均試用的方法:

使用lua指令碼:

redis-cli eval "redis.call('del', unpack(redis.call('keys','*')))" 0

但這種處理方式,量大的情況下,lua函式unpack會出現問題,會報錯誤

(error) err error running script (call to f_e177a091510d969af3b388ee986dbe6658df6b57): user_script:1: too many results to unpack

解決方法:

一次性unpack太多會出問題,那就乾脆一次5000吧,這樣就不會有問題了,實測速度非常快哦。

redis-cli eval "local keys = redis.call('keys', argv[1]) for i=1,#keys,5000

do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys" 0 'value*'

所以最終實現我的需求的**就是:

redis-cli eval "redis.call('del', unpack(redis.call('keys','*lz*')))" 0

redis-cli eval "

local keys = redis.call('keys', argv[1]) for i=1,#keys,5000

do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys" 0 '*lz*'

上述語句的執行原理其實是遞迴呼叫,通過遞迴最終實現了批量刪除。

在redis集群中可以借助指令碼實現集群上的批量刪除,這個還沒測試過。參考文章如下:

redis集群批量刪除指定的key

本文參考文章:

redis批量刪除key (windows適用)

redis批量刪除指定的key

批量刪除key redis 中有刪除單個 key 的指令 del,可以借助 linux 的 xargs 指令來完成這個動作 redis cli keys xargs redis cli del 如果redis cli沒有設定成系統變數,需要指定redis cli的完整路徑 如 opt redis r...

redis 集群批量刪除 某些key

驗證 插入資料10.20.26.92 7000 set test s1 1 10.20.26.92 7000 set test s2 2刪除資料redis cli h 127.0.0.1 p 6379 a 123456 keys test s xargs redis cli h 127.0.0.1 ...

Redis如何批量刪除指定模式鍵的值

今天有乙個小功能點是關於批量刪除redis指定的鍵。我以為幾分鐘既可以搞定的事情,沒想到花了我乙個鐘的時間。比如我redis存的鍵是 l topic l title l tag l url 它們都有共同的字首 l 所以我一頓操作直接 delete l 沒想到redis直接給我返回個0,意思沒有刪除任...