html - 根据用户id实现论坛用户头像显示的最佳实现
问题描述
我自己做的一个论坛里需要显示用户头像,但是觉得不太可能在每一个回复中都保存用户头像文件名,因为总不能用户修改头像之后再去修改数据里所有他曾经回复过的内容。
所以我在服务器(node+express)中做了一个专门用于显示头像的路由,get方式,路由中获取头像图片文件返回给用户,并且设置了一个缓存时间来降低服务器负荷,于是现在所有的用户头像url可以用用户id表示了。
然而这出现了一个问题,就是用户修改头像之后除非手动清理缓存或者等缓存过期,不然总是使用缓存的头像
那么如果避免缓存的问题呢?
我第一个想到的是设置must-revalidation,但是似乎并没有作用,而且每次都revalidation会不会导致服务器仍然要读取图片文件,导致磁盘性能下降?
第二种方式我考虑将用户头像文件名存在用户信息里,进入显示头像的路由之后重定向到实际的URI,然后配合nginx做静态资源服务和缓存。但是这似乎就增加了一次服务器访问。
不知道大家有什么更好的主意
问题解答
回答1:或许是我想简单了,也或许是你想复杂了。
头像是和用户相关的,当然直接存用户表里啊。
用户修改头像,上传新的头像到你的服务器,你可以得到图片并重命名,然后修改用户对应的头像字段,使其指向新的图片。
这样只要用户刷新页面不就拿到了新的头像了吗?
回答2:我觉得主要的问题时缓存更新。
浏览器有两种类型的缓存,Expires和LastModified/Etag。
Expires基于时间范围,在未过期前直接从缓存获取数据,没有网络请求,而Etag/LastModified会发网络请求校验数据,没有更新使用缓存,有更新获取最新数据。
所有解决方案是设置Etag/LastModified。如果图像更新并不需要很高的即时性,可以两种缓存结合起来,设置一定时长的Expires。
相关文章:
1. html5 - 百度Ueditor代码高亮和代码段滚动条冲突是怎么回事?2. javascript - 静态页面引公共头尾文件,js怎么写吖?3. docker gitlab 如何git clone?4. javascript - 读取页面源码,页面中所有的换行都被当成<br/>读取出来 了,,求解应该怎么让它被正确的解析5. javascript - 关于一段 for 循环代码执行顺序的问题6. docker网络端口映射,没有方便点的操作方法么?7. javascript - vue 数据更新了。但是dom没有更新,,,,,如图8. java - 3个dao的数据根据请求参数选择一个映射到一个url上,怎么写比较好?9. docker 17.03 怎么配置 registry mirror ?10. 如何调整IDEA中直接运行java程序的日志输出级别?