現在、ユーザーがアバターを変更したときにアバターを保存して無効にするために、次のことを行っています。
アバターはユーザーIDごとに保存され、それぞれ1000個のフォルダーに自動的に分割されます(ファイルシステムを支援し、各ディレクトリに数百万のファイルが存在しないようにするため)
ユーザーアバターを取得するための私の関数は、ユーザーID /性別/バージョン番号を取得します-バージョン番号が0より大きい場合
?ver=$ver
、URLにパラメーターが追加され、キャッシュされたアバターが他のユーザーによって再ダウンロードされます。バージョン番号が0の場合、URLは「性別」に基づいてデフォルトのアバターを返します。
性別とアバターのバージョンはuserdataテーブルに保存され、ユーザーがアバターを変更するたびにバージョンが増加します。
これはうまく機能し、データベースルックアップを最小限に抑えています。これは、任意の時点で、userid / sex/versionに基づいて関連する現在のアバターを生成するために必要なuserdataがすでにあるためです。ユーザーの現在のアバターを取得するために、再度クエリを実行したり、結合を実行したりする必要はありません。
ただし、アクティビティフィードを追加しているため、問題が発生しています。
アクティビティフィードの性質を考えると、通常、ストーリーデータをJSONとして保存しています(Redisでファンアウトし、永続層としてMySQLを使用するなど...)
特定のアクティビティ内で、情報を取得するときにJOINを実行する必要がないように、ユーザーのユーザーID、性別、バージョン番号を保存しています。もちろん、これは、ユーザーのアバターが変更された場合、古いアクティビティが古いアバターを表示している可能性があることを意味します。
この問題を回避する方法を探しています。理想的には、アクティビティフィードをクエリするときにJOINを追加する必要はありません。
これまでのところ、私が思いつくことができる唯一の解決策は、アクティビティフィードをクエリするときに、time()に基づいてパラメーターを追加し、新しいアバターがダウンロードされるようにすることです。ただし、もちろんこれは、フィードの場合、アバターがユーザーのブラウザーにキャッシュされないことを意味します。
もう1つのオプションは、フィードの更新をキューに入れ、関連するすべてのフィードを調べて新しいアバターバージョンで修正することですが、これはばかげているようです。
私が持っていた他の唯一の考えは、ログイン時にすべての友達のアバターのバージョン番号を取得し、セッション中のどこかに大きな配列で保存し、代わりにさまざまなアバターのURLにそれらを追加することでした。つまり、ルックアップは多数ではなく1つです。しかし、もちろん....これはあなたが友達ではない/フォローしていないユーザーからの活動についてのコメントを扱っていません。しかし、繰り返しになりますが、最新のアバターは、フォローしていない人にとって本当に重要ですか?おそらくそうではありません。
すべての解決策には、私には欠点があります。
他に利用できるオプションはありますか?アバターのURLストレージに関して、図面に戻る必要があります(ただし、これらのURLを履歴に保存し、フィード内で自動的に更新する別の方法は実際にはわかりません)。
どんな助けでも大歓迎です