大量のデータ処理を行っています。速度を上げるために、最初にデータを redis に保存してから、2 分間隔で postgresql データベースにダンプします。データを格納するために redis ハッシュを使用しましたが、redis のハッシュ キーでさえ、データベース テーブルの列に対応しています。
redis.scan()
データの行を格納する redis ハッシュのリストを取得するために使用し、ハッシュ内のデータを取得するために使用しredis.hgetall()
ています。そこから、SqlAlchemy で SQL Insert ステートメントを作成し、データベースへの一括データ挿入を実行します。
私が直面している問題は、最初に SCAN を使用してデータを含むキーを抽出する必要があることです。
redis_match = 'data:row_keys:*'
row_keys = rdb.scan_iter(match=redis_match, count=limit_no)
そこから、各ハッシュのすべてのデータをフェッチします。
for index, row_id in enumerate(row_keys):
row_data = rdb.hgetall(row_id)
row_data は次の形式ですkey:value
が、形式で保存されるbyte
ため、次を使用して各キーと値を手動でデコードするために余分なオーバーヘッドが発生します。
for key, value in row_data.items():
key = ast.literal_eval(key.decode('unicode_escape'))
value = ast.literal_eval(value.decode('unicode_escape'))
私はこれが多すぎると感じており、よりエレガントな方法が必要です:
- hgetall() を使用して redis からデータを取得し、redis ハッシュのキーが postgresql テーブルの列名に対応するため、そのデータを一括 SQL 挿入にすぐに使用できます。
- 1 が不可能な場合でも、少なくとも hgetall() を使用して redis からデータを取得し、エントリ全体、つまり各キーと値を反復する代わりにハッシュ内のすべてのエントリをオンザフライでデコードするためのより迅速な方法が必要です。
編集:
私はpostgresqlのForeign Data Wrappers、特にredis_fdwについて読んだことがあります.RedisからPostgresqlにデータを移動するためのより高速な方法を可能な限り最小限のトラブルで得るという私の状況を解決するものかどうか疑問に思っています.