gpt4 book ai didi

http - 我对 HTTP 缓存感到困惑

转载 作者:可可西里 更新时间:2023-11-01 15:08:28 24 4
gpt4 key购买 nike

我一直在考虑在 RESTful 环境中进行批量读写,我想我已经意识到我对 HTTP 缓存有更广泛的疑问。 (下面我使用逗号(“,”)来分隔多个记录ID,但这个细节并不专门讨论。)

我从这个问题开始:

1。单个 GET 因批量更新而失效

GET /farms/123         # get info about Old MacDonald's Farm
PUT /farms/123,234,345 # update info on Old MacDonald's Farm and some others
GET /farms/123

当客户端和 Farms 服务器之间的缓存服务器看到 PUT 时,它如何知道要使 /farms/123 的缓存无效?

然后我意识到这也是一个问题:

2。批量 GET 因单次(或批量)更新而失效

GET /farms/123,234,345 # get info about a few farms
PUT /farms/123 # update Old MacDonald's Farm
GET /farms/123,234,345

当缓存看到 PUT 通过时,它如何知道使多场 GET 无效?

所以我认为问题实际上只是与批处理操作有关。然后我意识到任何关系都可能导致类似的问题。假设一个农场有零个或一个所有者,而一个所有者可以拥有零个或一个农场。

3。单个 GET 因更新相关记录而失效

GET /farms/123   # get info about Old MacDonald's Farm
PUT /farmers/987 # Old MacDonald sells his farm and buys another one
GET /farms/123

当缓存看到 PUT 通过时,它如何知道要使单个 GET 无效?

即使您将模型更改为更加 RESTful,使用关系模型,您也会遇到同样的问题:

GET    /farms/123           # get info about Old MacDonald's Farm
DELETE /farm_ownerships/456 # Old MacDonald sells his farm...
POST /farm_ownerships # and buys another one
GET /farms/123

在#3 的两个版本中,第一个 GET 应该返回类似(JSON 格式)的内容:

farm: {
id: 123,
name: "Shady Acres",
size: "60 acres",
farmer_id: 987
}

第二个 GET 应该返回如下内容:

farm: {
id: 123,
name: "Shady Acres",
size: "60 acres",
farmer_id: null
}

但是不能!即使您适本地使用 ETag 也不行。您不能指望缓存服务器检查内容中的 ETag —— 内容可以被加密。而且您不能指望服务器通知缓存记录应该失效——缓存不会在服务器上自行注册。

那么我缺少标题吗?指示缓存应该在某些资源的任何 GET 之前执行 HEAD 的事情?如果我能告诉缓存哪些资源可能会被频繁更新,我想我可以忍受对每个资源的双重请求。

如果一个缓存接收到 PUT 并知道要使它的缓存无效,而另一个缓存却没有看到它,这个问题又如何呢?

最佳答案

缓存服务器应该在收到 PUT 时使 URI 引用的实体无效(但正如您所注意到的,这并不涵盖所有情况)。

除此之外,您可以在响应中使用缓存控制 header 来限制或防止缓存,并尝试处理询问 URI 自上次获取后是否已被修改的请求 header 。

这仍然是一个非常复杂的问题,实际上仍在研究中(例如,参见 http://www.ietf.org/internet-drafts/draft-ietf-httpbis-p6-cache-05.txt)

如果内容已加密(至少使用 SSL),则代理内的缓存实际上并不适用,因此这应该不是问题(尽管在客户端上仍然可能是问题)。

关于http - 我对 HTTP 缓存感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/433195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com