ホームページ  >  記事  >  Java  >  Redis内のデータを削除するにはどうすればよいですか?

Redis内のデータを削除するにはどうすればよいですか?

藏色散人
藏色散人オリジナル
2019-05-20 14:33:5715989ブラウズ

要件の変更により、以前のプロジェクトでは Redis に保存されているデータ形式を変更する必要がありました。新しいパッケージがリリースされた後、古いデータが新しいデータに挿入されないようにします。したがって、公開する前に古いデータをすべて削除する必要があります。現在、redis は複数のビジネスが関与するパブリック クラスターです。次に、他のビジネスの使用に影響を与えずに、大量の古いデータ (ライブラリ内のキーの総数は現在 1,200 万個) を削除する方法が問題になります。

Redis内のデータを削除するにはどうすればよいですか?

Redis データをバッチで削除する一般的な方法:

削除するデータのキーがわかっている場合、 redis-cli /usr/local/redis/bin/redis-cli del キーの del コマンドを使用するか、他の高級言語に対応する redis パッケージまたはライブラリを使用することもできます。たとえば、java の jedis と python の redis ライブラリ

java:   jdeis.del(key)
python: redis.delete(key)

削除するデータのキーが不明な場合、特定のパターンを満たすキーのみがわかります。この場合、redis のkeys コマンドを使用して、特定のパターンを満たすキーを見つける必要があります。

ビデオのプレフィックスを満たすすべてのキーを見つけます

/usr/local/redis/bin/redis-cli keys video_*

Linux の xargs を使用して、 completeバッチ削除/ usr/local/redis/bin/redis-cli keys video* | xargs /usr/local/redis/bin/redis-cli del 3. 削除するデータがライブラリ内のすべてのデータの場合、ライブラリ全体をクリアするには、flushdb を使用できます/ usr/local/redis/bin/redis-clilushdb

いくつかの方法の手順

最初の方法には次のものが必要です特定のキーについての明確な知識

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;

スクリプト 2 は del コマンドを 1 つずつ送信するため、実行効率は非常に低くなります。テストでは1時間で約120万件のデータが削除された。 10 時間以内に 1,200 万件のアイテムを削除する必要があります。 ! !各リクエストの送信にかかる時間を考慮して、redis パイプラインを使用してバッチ送信を実装することを考えました。 ###
__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'
###改良されたスクリプト 2 は、オンラインで実行するのにわずか約 2 分しかかかりません。 ! ###

以上がRedis内のデータを削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。