我有一个 REST API,我想在其中缓存索引的 JSON 响应 (GET /foo) 和读取操作 (GET /foo/1) 以显着提高性能。当资源上有 POST 或 PUT 时,索引和读取结果的缓存条目需要过期,因此不会提供旧内容。
这是最好使用 Squid / Varnish 之类的反向代理完成的场景,还是您会选择 memcache(d)?
我有一个 REST API,我想在其中缓存索引的 JSON 响应 (GET /foo) 和读取操作 (GET /foo/1) 以显着提高性能。当资源上有 POST 或 PUT 时,索引和读取结果的缓存条目需要过期,因此不会提供旧内容。
这是最好使用 Squid / Varnish 之类的反向代理完成的场景,还是您会选择 memcache(d)?
使用位于 HTTP 层的反向代理更加透明。这意味着可以通过网络查看正在发生的事情。不好的是,其中很少有人支持缓存经过身份验证的响应,因此如果您的资源需要身份验证,它们的效率可能会下降到 0。/foo
当完全不相关的资源 B ( /foo/1
) 被修改时,反向代理通常也不会自动使资源 A ( ) 过期。这是您必须以某种方式添加到解决方案中的正确行为。
如果使用 memcached,这两个问题都可以解决,因为它没有透明度要求。
我会选择像 varnish 这样的反向代理,因为您可以在不涉及缓存逻辑的情况下实现(和测试)您的服务,并将缓存添加为单独的层。您可以升级/重新启动您的服务,同时 varnish 为 GET 请求提供旧结果(非常适合可用性),并且很容易在 varnish 中设置规则以根据特定的 GET/POST 操作使现有缓存结果无效(清除)。
如果你想使用分布式内存,memcached 是一个很好的解决方案。https://github.com/cpatni/middleman是一个反向代理,它使用 memcached 进行缓存。