5

私の現在のプロジェクトでは、PostgreSQL をマスター DB として使用し、Redis を一種のスレーブとして使用しています。たとえば、ユーザーが別のユーザーをフレンドとして追加すると、最初に関係が PostgreSQL に保存され、次に Redis のフレンド リストが更新されます。 . 一部のユーザーのフレンド リストが要求されると、PostgreSQL ではなく Redis から取得されます。

問題は、Redis でフレンド リストを更新するとき、PostgreSQL から新しいコピーを取得し、Redis の古いリストを新しいリストに置き換えるか、古いリストを保持してユーザー ID をリストに SADD するだけでよいかということです。後者はもちろんパフォーマンスに最適ですが、直観的には前者の方がデータの整合性を維持するのに適していますか? また、Celery のようなものを使用する場合、2 番目の方法はリスクを負う価値があるでしょうか?

4

2 に答える 2

4

これは Redis とは関係ありません。2 つのデータベースに書き込む場合、両方が個別にデータの整合性を保証していても、多くのことがうまくいかない可能性があります。

議論のために、質問の Redis を MySQL に置き換えて、自問してみてください。データの整合性は損なわれますか?

Postgres に書き込みを行った後、MySQL に書き込みを行わずにプロセスが終了する可能性があります。または、ネットワークが停止している可能性があります。または、MySQL がダウンしている可能性があります。これらすべてのケースで、Postgres と MySQL は異なり始めます。

レコード全体を置き換えるか、単に 1 行を追加するかは問題ではありません。どちらもデータの破損につながる可能性があります。

データの整合性に関心がある場合は、データを単一の信頼できるシステムに保管してください。それ以外の場合は、2 フェーズ コミット プロトコルが必要になります。

于 2012-06-01T10:37:32.083 に答える
1

アプリケーションにとって一貫性がどれほど重要かを評価し、そこから物事を進める必要があります。コミットを失った場合、誰かが泣くようには聞こえません。PostgreSQL からデータを読み取り、それを Redis に戻すバックグラウンド プロセスを使用して、最終的に不整合を解消することができます。または、書き込みマスターからレプリケートする読み取りスレーブ PostgreSQL インスタンスを確認することもできます。これにより、十分にテストされた同期テクノロジを使用して、読み取りのスケーラビリティが向上します。

于 2012-06-01T13:27:59.873 に答える