前言
使用SDWebImage的时候,从服务器请求回来的头像URL没有变化,但是用户已经修改过头像,由于缓存的原因,不能显示出最新修改的用户的头像。在不去掉缓存的条件下,如何显示出最新的头像,给出策略。
淘宝、京东如何处理的
想到这样一个问题,自然会首先想想像淘宝、京东等电商App中会有大量的图片。比如,一个商品有很多的图片,其中,商家很可能在营业过程中突然修改商品的某个图片,但是所生成的图片的URL是固定链接,只是图片的内容被替换了而已。
那么问题来了,App端如何知晓哪个图片的内容发生了变化呢?如果不能确定图片内容发生变化,那么自然会直接读取缓存中的图片来显示。服务端是如何通知客户端的呢?
大家怎么想?求在评论中提供方案。
方案一
笔者所能想到的方案:
笔者针对这个问题,第一想到的就是通过图片的摘要验证。服务端在接口中返回用户信息时,连同图片的摘要(md5)值也下发到客户端,然后每次App登录时,服务端都将最新的用户信息返回来,客户端将本地所缓存的用户头像取出,也生成摘要(md5)五,与服务端所返回来的md5值比较,若相同表示没有头像没有修改过;若不相同,表示头像已经修改过。
缺点:只要重新登录或者App在后台自动登录后,才能更新。也就是说,如果用户没有退出登录,或者没有过期而不会自动登录,头像也没有更新得了。
方案二
在微博上收集到大家的方案。给URL添加一个参数version,当图片修改之后,URL的version发生变化,那么就会重新下载图片来缓存。
缺点:与方案一类似,要求重新请求数据才能得到最新的URL。
方案三
在修改图片时,要求不能使用相同的名字,这样链接路径是一样的,但是因为名字不同而找不到。此时,就会重新获取图片而不是缓存的。可以在文件名中带上前缀进行上传,譬如avatar-3/v1.jpg
,更新后改为avatar-3/v2.jpg
。
方案四
客户端在请求头加上If-Modified-Since字段,表明请求此时间后最新的文件资源,服务端也会在响应头返回这个last-modified字段表示上次修改时间。
来源于新浪微博用户:@我的双刃剑蜀山第一