0

我有一个问题,如果有人可以给出一个伪示例,这是如何处理的,我将不胜感激。

假设我的应用程序具有可以执行 GET 的 url

/clients/{clientId}/contactsSummary
/locations/{locationId}/contactsSummary

我想做兑现。现在如果我做 POST/PATCH/DELETE

/contacts/{contactId} 

缓存如何失效。显然,更改、创建或删除联系人会导致前两个 url 返回缓存版本,这是不正确的。处理这个问题的机制是什么?

4

2 回答 2

0

如果前端绝对需要最新信息,请不要缓存。否则,为每个缓存项添加一个过期时间,从检索到它们的那一刻起可能是 1 秒到 1 小时(或更长时间)。

不过,您可能需要处理一致性问题。例如,您可能拥有对过期联系人的未过期引用。

假设cache是一个从 URL 到 tuple 的字典(expires,data)。检索 URL 的伪代码是:

cacheItem= cache[ULR]
if( cacheItem == null || cacheItem.expires < currentTime )
    cacheItem= ( currentTime + 1_hour , http_get(URL) )
    cache[ULR]= cacheItem
return cacheItem.data
于 2013-08-20T14:26:10.190 回答
0

客户端决定是否要检索资源的当前表示。使用所谓的“条件 GET”。

如果请求消息包含 If-Modified-Since、If-Unmodified-Since、If-Match、If-None-Match 或 If-Range 头字段,则 GET 方法的语义更改为“条件 GET”。条件 GET 方法请求仅在条件头字段描述的情况下传输实体。条件 GET 方法旨在通过允许刷新缓存的实体而不需要多个请求或传输客户端已经持有的数据来减少不必要的网络使用。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html的第 9.3 节)

这是如何运作的?C是客户端,S是服务器。

C

GET /path/to/resource

小号

200 OK
ETag: foo
Last-Modified: Tue, 15 Nov 1994 12:45:00 GMT

C

客户端PUTsa 修改版本。

PUT /path/to/resource
If-Match: foo

小号

客户端具有当前版本,因此PUT资源上的 a 是可以的。

200 OK
ETag: bar
Last-Modified: Tue, 15 Nov 1994 12:46:00 GMT

C

客户端PUT修改了版本,但与此同时资源已更改并且ETag: bar不再匹配。

PUT /path/to/resource
If-Match: bar

小号

412 Precondition Failed

C

客户端GET是资源的当前版本。

GET /PATH/to/resource

小号

200 OK
ETag: baz
Last-Modified: Tue, 15 Nov 1994 12:47:00 GMT

C

现在客户端可以PUT再次获取资源。

PUT /path/to/resource
If-Match: ba7

小号

200 OK
ETag: qux
Last-Modified: Tue, 15 Nov 1994 12:48:00 GMT
于 2013-08-20T15:19:35.257 回答