我自己做的一个论坛里需要显示用户头像,但是觉得不太可能在每一个回复中都保存用户头像文件名,因为总不能用户修改头像之后再去修改数据里所有他曾经回复过的内容。
所以我在服务器(node+express)中做了一个专门用于显示头像的路由,get方式,路由中获取头像图片文件返回给用户,并且设置了一个缓存时间来降低服务器负荷,于是现在所有的用户头像url可以用用户id表示了。
然而这出现了一个问题,就是用户修改头像之后除非手动清理缓存或者等缓存过期,不然总是使用缓存的头像
那么如果避免缓存的问题呢?
我第一个想到的是设置must-revalidation,但是似乎并没有作用,而且每次都revalidation会不会导致服务器仍然要读取图片文件,导致磁盘性能下降?
第二种方式我考虑将用户头像文件名存在用户信息里,进入显示头像的路由之后重定向到实际的URI,然后配合nginx做静态资源服务和缓存。但是这似乎就增加了一次服务器访问。
不知道大家有什么更好的主意
大家讲道理2017-04-17 15:20:56
私はそれをシンプルにしたいのかもしれませんし、あなたはそれを複雑にしたいのかもしれません。
アバターはユーザーに関連付けられており、もちろんユーザー テーブルに直接保存されます。
ユーザーがアバターを変更し、新しいアバターをサーバーにアップロードします。画像を取得して名前を変更し、新しい画像を指すようにユーザーの対応するアバター フィールドを変更できます。
ユーザーはページを更新すれば新しいアバターを取得できるのではないでしょうか?
伊谢尔伦2017-04-17 15:20:56
主な問題はキャッシュの更新だと思います。
ブラウザには、Expires と LastModified/Etag という 2 種類のキャッシュがあります。
有効期限は時間範囲に基づいており、有効期限が切れる前にキャッシュから直接データを取得します。一方、Etag/LastModified はデータを検証するためにネットワーク リクエストを送信します。更新がない場合、キャッシュは無効になります。アップデートがあれば最新のデータを取得します。
すべての解決策は、Etag/LastModified を設定することです。イメージの更新に高い即時性が必要ない場合は、2 つのキャッシュを組み合わせて、一定期間の Expires を設定できます。