[解決済み] PythonでRedisデータベースの全キーを取得する
質問
Redisで利用可能なキーを全て取得するコマンドの投稿がありますが、Pythonで行いたいのです。
何か方法があれば教えてください。
どのように解決するのですか?
使用方法
scan_iter()
scan_iter()
よりも優れています。
keys()
の方が優れています。なぜなら、全てのキーをメモリにロードするのではなく、イテレータを使用することができるからです。
私はredisに1Bのレコードを持っていましたが、一度にすべてのキーを返すのに十分なメモリを確保することができませんでした。
キーを1つ1つスキャンする
以下のpythonのスニペットは
scan_iter()
を使って、パターンにマッチする全てのキーをストアから取得し、それらを一つずつ削除しています。
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter("user:*"):
# delete the key
r.delete(key)
一括スキャン
もし、スキャンするキーのリストが非常に大きい場合、例えば、100kキーより大きい場合、このようにバッチでスキャンするのが効率的でしょう。
import redis
from itertools import izip_longest
r = redis.StrictRedis(host='localhost', port=6379, db=0)
# iterate a list in batches of size n
def batcher(iterable, n):
args = [iter(iterable)] * n
return izip_longest(*args)
# in batches of 500 delete keys matching user:*
for keybatch in batcher(r.scan_iter('user:*'),500):
r.delete(*keybatch)
このスクリプトをベンチマークしたところ、バッチサイズ500を使用すると、キーを1つずつスキャンするよりも5倍速いことがわかりました。さまざまなバッチサイズ (3,50,500,1000,5000) をテストして、500 のバッチサイズが最適であることがわかりました。
を使うかどうかに関わらず
scan_iter()
または
keys()
メソッドを使用する場合、操作はアトミックではなく、途中で失敗する可能性があります。
コマンドラインでの xargs の使用は絶対に避けてください。
私は、他の場所で繰り返されているこの例をお勧めしません。ユニコードのキーでは失敗し、適度な数のキーであっても信じられないほど遅くなります。
redis-cli --raw keys "user:*"| xargs redis-cli del
この例では、xargsは全てのキーに対して新しいredis-cliプロセスを作成します!これは悪いことです。
この方法をベンチマークしてみたところ、最初のPythonの例でキーを1つずつ削除していく方法よりも4倍遅く、500個まとめて削除する方法よりも20倍遅くなりました。
関連
-
[解決済み】Pythonのvirtualenvを離脱/終了/無効化する方法
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] バイトを文字列に変換する
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] 利用可能なすべてのキーを取得するためのRedisコマンド?
-
[解決済み】Pythonで辞書のキーをリストとして返すには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 利用可能なすべてのキーを取得するためのRedisコマンド?
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] 新しいpip backtrackingの実行時問題の解決