Redis で key_name_*
で一致する key を削除したいときに
key に使用している文字列によって最適な方法が違うのでまとめておく.
だいたいは redis-cli コマンドで ok
redis-cli KEYS "key_name_*" | xargs redis-cli DEL
基本的にはこれを使えば問題ない.
クォートを使った文字列の場合
key にクォートが含まれていると xargs が文字列を処理できずエラーになる.
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
Linux 環境
redis-cli KEYS "key_name_*" | xargs -d '\n' redis-cli DEL
-d オプション について
every character in the input is taken literally.
文字列がそのまま解釈されるようになる.
macOS 環境
redis-cli KEYS "key_name_*" | xargs -0 redis-cli DEL
macOS の xargs には -d オプションがない.
その他
Lua
Redis 2.6 以降では EVAL コマンドで Lua Scripting で操作することができ, それを使った方法.
redis-cli EVAL "return redis.call(\'DEL\', unpack(redis.call(\'KEYS\', ARGV[1])))" 0 "key_name_*";
ただし, 1024件以上のデータ量になる場合 too many results to unpack
エラーが発生する.
Lua の Default Stack Size が 1024 で定義されているため.
Lua 4.0.1 source code - llimits.h
対策( Feature request, zrevrangebyscore with STORE option · Issue #678 · antirez/redis · GitHub )はあるけど
素直に xargs 使ったほうが良さそう.