爲啥會有這篇文章呢? 在redis裏我須要批量刪除一些 "特殊" 的數據...這些特殊的數據用正常方法比較難刪除...因此記錄一下個人刪除方法..linux
我再用SpringBoot集成Spring的@Cacheable的時候遇到了一些比較麻煩的事情...redis
第一個是序列化問題...相信你們通常都會遇到過..spring
redisTemplate默認用的是JdkSerializationRedisSerializer工具
因此會生成這個樣子的字符串...學習
其實這個樣子的字符串也不要緊......只要他能正常刪除就好了...但是恰恰不少可視化工具都不支持...lua
redis自己是沒有批量刪除命令的...但是話工具是提供批量刪除的..原理是把全部知足條件的key找出來1個1個刪除...那如今問題就是他key不認識...是亂碼..因此也就刪除不了了..spa
在命令行1個1個刪除是沒問題的...可是key多了就GG了.......命令行
用這種jdk自帶的序列化來序列化string的key我以爲是不合理的...這個key看都看不懂...因此咱們能夠指定用其餘方法來序列化key...3d
spring自己提供了String的序列化方式(StringRedisSerializer)...因此咱們能夠用這個序列化類來序列化keycode
這樣生成的key很正常..很美觀...也是咱們想要的
方法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腳本作批量刪除呢? 值得嘗試.....