Redis でワイルドカードを使った複数 key の一括削除

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.

文字列がそのまま解釈されるようになる.

xargs(1) - Linux manual page

macOS 環境

redis-cli KEYS "key_name_*" | xargs -0 redis-cli DEL

macOS の xargs には -d オプションがない.

xargs(1) Mac OS X Manual Page

その他

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 使ったほうが良さそう.

参考

Delete redis keys with unmatched single quotes · GitHub