2

現在、ユーザーがアバターを変更したときにアバターを保存して無効にするために、次のことを行っています。

  • アバターはユーザー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を履歴に保存し、フィード内で自動的に更新する別の方法は実際にはわかりません)。

どんな助けでも大歓迎です

4

1 に答える 1

2

あなたの設定についてはよくわかりませんが、nginxではこれでうまくいくと思います:

location ^~ /avatars/ {
        add_header Pragma public;
        add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}

そしてアパッチで:

Header set Cache-Control "public, must-revalidate"
于 2012-10-09T11:57:46.190 に答える