2017-05-13 6 views
2

今後のRedis 4には非同期UNLINKがありますが、それまでは大きなセット・キーのDELETeを実装する良い選択肢は何ですか?遅いDEL大きなキーの代わりに

RENAMEに一意の名前を付け、EXPIREを1秒とすると良い解決法ですか?元のキー名を使用できるようにします。すぐにメモリを解放することはすぐには重要ではありませんが、Redisは可能な限り非同期ガベージコレクションを実行できます。

答えて

1

EXPIREは遅延を排除しません。サーバーが実際に値を失効するまで遅延させます(Redisはおおよその有効期限アルゴリズムを使用します)。サーバーが実際に値を失効させると、値が削除されるまでサーバーをブロックするDELコマンドが発行されます。

あなたがV4のUNLINKを使用することができない場合、あなたは大規模なセットを削除することについては行くことができる最良の方法は、インクリメンタルにそれを排出することによってです。これは簡単なこの1のように帯域幅を減らすために、サーバー側のLuaスクリプトで行うことができます。

local target = KEYS[1] 
local count = tonumber(ARGV[1]) or 100 
local reply = redis.call('SPOP', target, count) 
if reply then 
    return #reply 
else 
    return nil 
end 

、ドレインキーツー・削除されるの名前の上に繰り返しスクリプトを呼び出し、とするにはあなたがRedisの返信を得るまで、またはカウントの引数なしで。

+0

ありがとうございました。 Redisは時間がかかり、ビジー/ローディングが少ないときに値をクリーンアップしますか?私の主な関心事は、鍵を削除する必要があるが、クリーンアップを待つ気にはならないクライアントをブロックしていることです。Redisの呼び出しからすぐに戻り、他の非Redisの作業を進めることができます。 – user2526241

+0

v4のUNLINKは遅延を改善します。つまり、クリーンアップされているキーを気にしない他のクライアントをブロックすることなく、真に非同期になりますか? – user2526241

+0

良い時間を取っている - はい、しかし、Redisは値を期限切れにするのにかかる時間を考慮していないので、たとえサーバーの使用量が少なくても、大きな値が残っていても、取り除くのに時間がかかります。 v4非同期UNLINKへのwrt、はい - メモリを解放することはブロッキングなしで行われますが、キーはすぐにデータベースから削除されます。 –

関連する問題