一旦你知道了数据的价值和获取这些数据的成本,你就可以决定最好的缓存策略。
如果我有一个rest式服务,该服务通过端点具有可发现的资源,例如:
请求:GET http://acme.org/someInfo
反应:
HTTP/1.1 200 OK
Content-Length: ...
Content-Type: application/vnd.acme+xml
Date: Fri, 16 Dec 2012 12:40:00 GMT
Last-Modified: Tue, 1 Mar 2012 11:45:00 GMT
<someInfo xmlns="http://schemas.acme.org/someInfo" xmlns:dap="http://schemas.acme.org/dap">
<dap:link rel="http://relations.acme.org/someInfo" uri="htp://acme.org/someInfo/foo" />
<dap:link rel="http://relations.acme.org/someInfo" uri="htp://acme.org/someInfo/bar" />
<dap:link rel="http://relations.acme.org/someInfo" uri="htp://acme.org/someInfo/baz" />
</someInfo>
然后有了这个响应,客户端可以遵循其中一个超媒体链接:
请求:GET http://acme.org/someInfo/foo
反应:
HTTP/1.1 200 OK
Content-Length: ...
Content-Type: application/vnd.acme+xml
Date: Fri, 16 Dec 2012 12:45:00 GMT
Last-Modified: Wed, 28 Sep 2012 11:45:00 GMT
<fooInfo xmlns="http://schemas.acme.org/fooInfo">
...
</fooInfo>
第一个反应可能变化不频繁(例如:许多个月),第二个反应可能变化更频繁(例如:每个月左右)。对于这种场景,好的HTTP缓存策略是什么?按日期,客户端ETag比较,还有什么?
EDIT:如果数据在一天左右的时间内是陈旧的,那没关系。
这是一个性能与一致性的问题,实际上只能由业务来解决。
对于每个资源,你需要问两个问题:
- 如果资源发生变化,用户没有看到X的变化小时,业务影响是什么?如果用户看不到温度的变化,反应堆会爆炸吗?
- 看一看要花多少钱该资源的新版本?你使用的是1Gbps的本地网络吗?或者在西伯利亚用手机访问它?