要件の変更により、以前のプロジェクトでは Redis に保存されているデータ形式を変更する必要がありました。新しいパッケージがリリースされた後、古いデータが新しいデータに挿入されないようにします。したがって、公開する前に古いデータをすべて削除する必要があります。現在、redis は複数のビジネスが関与するパブリック クラスターです。次に、他のビジネスの使用に影響を与えずに、大量の古いデータ (ライブラリ内のキーの総数は現在 1,200 万個) を削除する方法が問題になります。
Redis データをバッチで削除する一般的な方法:
削除するデータのキーがわかっている場合、 redis-cli /usr/local/redis/bin/redis-cli del キーの del コマンドを使用するか、他の高級言語に対応する redis パッケージまたはライブラリを使用することもできます。たとえば、java の jedis と python の redis ライブラリjava: jdeis.del(key) python: redis.delete(key)
/usr/local/redis/bin/redis-cli keys video_*
いくつかの方法の手順
最初の方法には次のものが必要です特定のキーについての明確な知識
keys コマンドを使用するライブラリ内のデータの量が多すぎる場合、keys コマンドは Redis に対する他のすべてのリクエストをブロックします。間違いなく、このアプローチはパブリック Redis クラスターには推奨されません。もちろん、特定のビジネス ニーズを考慮する必要があります。それがうまくいかない場合は、ビジネス トラフィックが比較的少ないときに削除スクリプトを実行することもできます。
flushdb を使用すると、ライブラリ全体のデータが消去されます。
私の解決策 オンライン Redis クラスターはマスタースレーブ構造を使用します。したがって、リクエストをブロックする key コマンドをスレーブ ノードで実行して、特定のプレフィックスを満たすすべてのキーを見つけることができます。次に、シェル スクリプトまたは高級言語を使用して、マスター ノード上のデータを削除します。 #プレフィックスがビデオ、アルバム、俳優であるすべてのキーを取得し、これらのキーをファイル /data/keys.txt #!/bin/bashに追加します。
keys=('video' 'album' 'actor'); host='localhost'; port='6378'; for key in ${keys[@]}; do cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} keys gal.video.${key}* >> /data/keys.txt"; echo ${cmd}; eval ${cmd}; done; # 根据前面生成的key,删除数据 #!/bin/bash host='localhost'; port='6378'; file="/data/keys.txt"; i=0; cat ${file} | while read key; do let i=i+1; cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} del ${key}"; echo "line:"${i}",cmd:"${cmd}; eval ${cmd}; done;
__author__ = 'litao' from redis import Redis host="127.0.0.1" port=6379 db=0 r =Redis(host,port,db) pl=r.pipeline() per_pipe_size=10000 count=0 file = open("/data/keys.txt") print "start del all keys in "+file.name while 1: lines = file.readlines(10000) if not lines: break for key in lines: key=key.strip('\n') pl.delete(key) count=count+1 if(count==per_pipe_size): count=0 pl.execute() pl.execute() file.close() print 'finish del all keys'
以上がRedis内のデータを削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。