我自己做的一个论坛里需要显示用户头像,但是觉得不太可能在每一个回复中都保存用户头像文件名,因为总不能用户修改头像之后再去修改数据里所有他曾经回复过的内容。
所以我在服务器(node+express)中做了一个专门用于显示头像的路由,get方式,路由中获取头像图片文件返回给用户,并且设置了一个缓存时间来降低服务器负荷,于是现在所有的用户头像url可以用用户id表示了。
然而这出现了一个问题,就是用户修改头像之后除非手动清理缓存或者等缓存过期,不然总是使用缓存的头像
那么如果避免缓存的问题呢?
我第一个想到的是设置must-revalidation,但是似乎并没有作用,而且每次都revalidation会不会导致服务器仍然要读取图片文件,导致磁盘性能下降?
第二种方式我考虑将用户头像文件名存在用户信息里,进入显示头像的路由之后重定向到实际的URI,然后配合nginx做静态资源服务和缓存。但是这似乎就增加了一次服务器访问。
不知道大家有什么更好的主意
나는 간단하길 원할 수도 있고, 당신은 복잡하기를 원할 수도 있습니다.
아바타는 사용자와 연관되어 있으며 당연히 사용자 테이블에 직접 저장됩니다.
사용자가 아바타를 수정하고 새 아바타를 서버에 업로드합니다. 이미지를 가져와 이름을 바꾼 다음 사용자의 해당 아바타 필드를 수정하여 새 이미지를 가리킬 수 있습니다.
사용자가 페이지를 새로 고치기만 하면 새로운 아바타를 얻을 수 있지 않나요?
가장 큰 문제는 캐시 업데이트인 것 같아요.
브라우저에는 Expires와 LastModified/Etag라는 두 가지 유형의 캐시가 있습니다.
Expires는 시간 범위를 기반으로 하며 만료되기 전에 캐시에서 직접 데이터를 가져옵니다. 네트워크 요청은 없지만 Etag/LastModified는 데이터를 확인하기 위해 네트워크 요청을 보냅니다. 업데이트가 있으면 최신 데이터를 가져옵니다.
모든 해결 방법은 Etag/LastModified를 설정하는 것입니다. 이미지 업데이트에 높은 즉시성이 필요하지 않은 경우 두 캐시를 결합하고 특정 기간 동안 만료를 설정할 수 있습니다.