Redisで大きなソート済みセット(Sorted Set)を安全に削除する方法
Redisで大きなオブジェクトの削除が遅くなる理由について詳しく知りたい方は、まず概要記事をご覧ください。
Redisで大きなソート済みセット(Sorted Set)を削除するには、以下の手順を実行します。
-
キーを一意な名前空間付きの新しいキーにリネームします。これにより、他のRedisクライアントからはソート済みセットが即座に「削除された」ように見えます。
-
ソート済みセットのメンバーを、小さなバッチ単位で少しずつ段階的に削除し、セットが空になるまで繰り返します。削除コマンドのサイズを制限することで、サーバーが長時間ブロックされるのを防ぎます。
注意点
以下のコードは、Redis接続の障害を適切にハンドリングしていません。いずれかのRedisコマンドが失敗して例外が発生した場合は、手動でクリーンアップを行う必要があります。
擬似コード
# キーをリネームする
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.zset.key", newkey)
# ソート済みセットのメンバーを100件ずつのバッチで削除する
while redis.ZCARD(newkey) > 0
redis.ZREMRANGEBYRANK(newkey, 0, 99)
end
Rubyでの実装例
$redis = Redis.new
def delete_sorted_set(key)
# キーをリネームする
newkey = "gc:zsets:#{$redis.incr("gc:index")}"
$redis.rename(key, newkey)
# メンバーを100件ずつのバッチで削除する
while $redis.zcard(newkey) > 0
$redis.zremrangebyrank(newkey, 0, 99)
end
end
# 使用例:
#
# delete_sorted_set("my.large.set")
上記の処理をRubyのバックグラウンドジョブで実装した例も公開されています。
- Resque
- Sidekiq
← 「Redisでの大きなオブジェクトの削除」に戻る
-
Redis ZRANGEコマンド徹底解説 – ソート済みセットから指定ランク範囲の要素を昇順で取得する方法
このチュートリアルでは、RedisのZRANGEコマンドを使って、スコアが昇順に並んだソート済みセット(Sorted Set)から、指定したランク範囲内の1つまたは複数の要素を取得する方法を詳しく解説します。 ZRANGEコマンドとは ZRANGEコマンドは、指定したキーに保存されているソート済みセットの中から、指定した範囲に含まれる1つ以上の要素を返します。ソート済みセット内の要素はスコアの昇順に並んでおり、同じスコアを持つ要素同士は辞書順(レキシコグラフィカル順)で比較されます。 範囲はstart(開始位置・範囲に含む)とend(終了位置・範囲に含む)のオフセットによって定義されます。これ
-
Redis ZCARDコマンドの使い方 – ソート済みセットの要素数を取得する方法
このチュートリアルでは、Redisのコマンド「ZCARD」を使用して、指定したキーに保存されたソート済みセット(Sorted Set)のサイズ(要素数)を取得する方法を解説します。redis-cliにおけるZCARDコマンドの基本構文は以下のとおりです。 構文 redis host:post> ZCARD <key name> 戻り値 (integer) ソート済みセットに含まれる要素数を表す整数値 (integer) 0:指定したキーが存在しない場合 エラー:キーは存在するが、値がソート済みセットではない場合 ZCARDコマンドの計算量はO(1)であるため、セットに大量の要