Redisで大きなセットを安全に削除する方法
Redisで大きなオブジェクトの削除が遅くなる理由について、まずは概要をご覧ください。
Redisで大きなセット(Set)を削除する場合、DELコマンドをそのまま実行するとサーバーが長時間ブロックされ、他のクライアントに大きな影響を与えてしまいます。そこで、以下の2段階の手順で安全に削除を行います。
削除手順の基本
-
キーの名前を変更する: 対象のキーを一意な名前空間付きの新しいキーにリネームします。これにより、他のRedisクライアントからは即座に「削除された」ように見えます。
-
メンバーを少しずつ削除する: セットのメンバーを小さなバッチ(まとまり)に分けて、セットが空になるまで段階的に削除していきます。削除コマンドのサイズを制限することで、サーバーが長時間ブロックされるのを防ぎます。
注意: 以下のコードはRedis接続エラーを適切にハンドリングしていません。いずれかのRedisコマンドが失敗して例外が発生した場合は、手動でクリーンアップを行う必要があります。
擬似コード
# キーをリネーム
newkey = "gc:hashes:" + redis.INCR("gc:index")
redis.RENAME("my.set.key", newkey)
# 100件ずつバッチでメンバーを削除
cursor = 0
loop
cursor, members = redis.SSCAN(newkey, cursor, "COUNT", 100)
if size of members > 0
redis.SREM(newkey, members)
end
if cursor == 0
break
end
end
Rubyでの実装例
$redis = Redis.new
def delete_set(key)
# キーをリネーム
newkey = "gc:sets:#{$redis.incr("gc:index")}"
$redis.rename(key, newkey)
# 100件ずつバッチでメンバーを削除
cursor = "0"
loop do
cursor, members = $redis.sscan(newkey, cursor, count: 100)
$redis.srem(newkey, members) if members.size > 0
break if cursor == "0"
end
end
# 使用例:
#
# delete_set("my.large.set")
バックグラウンドジョブでの実行
大規模なセットの削除処理は時間がかかる可能性があるため、バックグラウンドジョブとして実行するのがおすすめです。Rubyでは、以下のようなジョブフレームワークを使った実装例があります。
- Resque
- Sidekiq
これらのフレームワークを利用することで、アプリケーションのレスポンスに影響を与えることなく、非同期に削除処理を進められます。
← 「Redisで大きなオブジェクトを削除する」に戻る
-
Redis GEODISTコマンド徹底解説 – 地理空間データの2つのメンバー間の距離を取得する方法
このチュートリアルでは、キーに保存された地理空間値(ジオスペーシャルデータ)の2つのメンバー間の距離を取得する方法について学びます。この目的のために、RedisのGEODISTコマンドを使用します。 GEODISTコマンドとは GEODISTコマンドは、キーに保存された地理空間値(ソート済みセット)のうち、指定した2つのメンバー間の距離を、指定した単位で返すために使用されます。指定されたメンバーの一方または両方が地理空間値に存在しない場合は、nullが返されます。 指定できる単位は以下の4種類です。 m:メートル(デフォルト) km:キロメートル mi:マイル ft:フィート キーが存在し
-
Excelで大量データを効率よく分析する6つの実践テクニック
本記事では、Excelを使って大量のデータセットを効率的に分析する方法を詳しく解説します。ビジネス活動の強みや課題を把握することは非常に重要です。組織の売上や販売記録を管理するのは動的なプロセスであり、一定期間内に販売・購入・取引が頻繁に行われるため、過去3〜4か月分の売上や利益を確認しようとすると、膨大な量のデータに直面することになります。 幸いなことに、Excelにはこうした課題を解決できる便利な機能が数多く備わっています。大量データを部分的に分割して分析すれば、計算作業もぐっと楽になります。 Excelで大量データを分析する6つの方法 ここからは、以下のサンプルデータセットを使って解説