1. 程式人生 > >redis 批量刪除鍵

redis 批量刪除鍵

工具 比較 war end oot 腳本 刪除 bsp 主題

主題

  為啥會有這篇文章呢? 在redis裏我需要批量刪除一些 "特殊" 的數據...這些特殊的數據用正常方法比較難刪除...所以記錄一下我的刪除方法..

背景與問題

我再用SpringBoot集成Spring的@Cacheable的時候遇到了一些比較麻煩的事情...

第一個是序列化問題...相信大家一般都會遇到過..

技術分享圖片

redisTemplate默認用的是JdkSerializationRedisSerializer

技術分享圖片

所以會生成這個樣子的字符串...

其實這個樣子的字符串也沒關系......只要他能正常刪除就行了...可是偏偏很多可視化工具都不支持...

技術分享圖片

redis本身是沒有批量刪除命令的...可是話工具是提供批量刪除的..原理是把所有滿足條件的key找出來1個1個刪除...那現在問題就是他key不認識...是亂碼..所以也就刪除不了了..

在命令行1個1個刪除是沒問題的...但是key多了就GG了.......

解決辦法

辦法1

用這種jdk自帶的序列化來序列化string的key我覺得是不合理的...這個key看都看不懂...所以我們可以指定用其他方法來序列化key...

spring本身提供了String的序列化方式(StringRedisSerializer)...所以我們可以用這個序列化類來序列化key

技術分享圖片

這樣生成的key很正常..很美觀...也是我們想要的

技術分享圖片

方法2

方法1是一種解決辦法...但是最為學習來說我希望能有一種不是回避而是通過技術手段來解決這個問題的方法...方法1的解法是可行的.也是不錯的...但到底是有沒有辦法批量去刪除redis的key...

有的...網上大部分給的解法是這樣的:

1  redis-cli -h 192.168.0.8 -p 6380 keys "obj_base_*" |xargs redis-cli -h 192.168.0.8 -p 6380 del

這樣是一種解決辦法...但是可能是我LINUX命令不太好吧...這種刪除方法對於key裏面有\xAC等jdk序列化生成的字符的時候是會報錯的...如果這種方法不報錯...那可視化工具也是能刪除的...所以這就很尷尬了...

xargs: WARNING: a NUL character occurred in the input.  It cannot be passed through in
the argument list. Did you mean to use the --null option?

可能精通linux命令的小朋友會有什麽命令可以處理這些字符吧...但是我還不太會....= =

所以我自己用另外1種辦法...

我想:在命令行可以刪除.那再命令行可以獲取真正的帶引號的字符串..那只要批量執行這個命令行就OK了吧..

redis是支持lua腳本的...那我自己寫個lua腳本就行了吧

花了十幾分鐘學習了語法以後成功寫出了1個非常簡單的腳本...但是還是蠻實用的..

1 local key=KEYS[1]
2 local result={};
3 local list=redis.call("keys", key);
4 for i,v in ipairs(list) do
5     redis.call("del", v);
6         table.insert(result,i,v);
7 end
8 
9 return result;

技術分享圖片

這樣就比較完美的解決了批量刪除問題.

小結

redis可以支持lua腳本真的很好...通過這個腳本可以做一些擴展功能...

那麽我能不能自定義一些dels命令去調用lua腳本做批量刪除呢? 值得嘗試.....

redis 批量刪除鍵