Redis Clusterでデータをパターンで削除する


結論

正攻法はないのでスクリプトを書く

概要

Redisデータをパターンで削除する方法は Redisのパターンに一致するキーを削除
などの記事で紹介されていますが(とはいえ正攻法ではない)、Redis Clusterを使用していると、keyのprefixが同じでもデータがノードに分散してしまって一気に参照や削除するのが難しくなります。

そもそもリリース環境でそんなことをすることはほぼないのですが、開発環境からRedis Clusterを使っているとちょっと困ります。
間違えてぶっ壊れたデータを保存してしまった場合にえいやっと削除したいときにどうするか。

スクリプト

結果から言うと、こういうスクリプトを書くのが一番早いです。

delete-pat
#! /usr/bin/env python

import sys
import commands

print sys.argv

# ノードは自分で設定してくだしあ
nodes = [
"localhost:10000",
"localhost:10001",
"localhost:10002"
]

pat = sys.argv[1]
for node in nodes:
    host, port = node.split(":")
    output = commands.getoutput("redis-cli -h {host} -p {port} -c keys {pat}".format(host=host,port=port,pat=pat))
    result = filter(lambda s:len(s) > 0, output.split("\n"))
    print host, port
    print result
    for key in result:
        print commands.getoutput("redis-cli -h {host} -p {port} -c del {key}".format(host=host,port=port,key=key))

こんなふうに使います

./delete-pat hoge:fuga:*

こちらからは以上です。