【发布时间】:2009-11-28 12:10:49
【问题描述】:
在this 文章中,有人认为如果您经常从数据库中获取随机实体,则使用 Memcache,如果您使用 REST 架构,则使用 Squid。请解释原因(关于 Squid)。
【问题讨论】:
标签: optimization rest caching squid
在this 文章中,有人认为如果您经常从数据库中获取随机实体,则使用 Memcache,如果您使用 REST 架构,则使用 Squid。请解释原因(关于 Squid)。
【问题讨论】:
标签: optimization rest caching squid
Memcache 是一个分布式对象存储 - 将对象放入和取出由您决定。它是任何用途的通用缓存。
Squid 是一个代理服务器和一个网络缓存。如果一切都通过 URL(例如 REST),那么 Squid 将免费完成这项工作。
总而言之,memcache 是通用的,Squid 是用于缓存 URL 的结果。
【讨论】:
REST 是关于 http 和资源的。
squid 可以用作reverse proxy,因此它会从网络服务器中获取负载。服务器端可以设置some expires http header来表示缓存的时间窗口。
这就是说,缓存主要是通过标准的 http 标头完成的,因此它比缓存 db 查询更接近于 rest 样式架构。
【讨论】:
Squid(作为代理和缓存)可以有效地与 REST 端点一起使用。在 REST 中,资源(应该)使用 ETAG/Last-Modified 标头显式传输,以便于缓存。
此外,REST 中的许多操作(假定)是幂等的(重复而没有进一步的副作用):这对 Squid 来说是一个完美的情况。它可以单独执行这些操作,而不会打扰应用程序服务器。
【讨论】:
Rest 使用 http 动词进行正确操作,即 GET 始终是非破坏性的。网址的命名也是一致的。这意味着 Squid 中的 http 缓存可用于提高性能,而无需依赖底层编程技术(ASP MVC、Rails、CouchDB 等)
【讨论】:
(这个答案比最初的问题晚了十年——但鉴于我在我咨询过的大型组织中遇到过这个问题,我认为在这里解释一下很有用。)
当Roy Fielding查看SOAP时,他意识到如果HTTP Methods(GET、POST等)用于访问和修改资源而不是仅使用HTTP对于单纯的远程过程调用,可以利用 HTTP 规范的其余部分,例如缓存 (RFC-2616)。 Fielding's layered architecture 说明了这一点。这就是他设计REST的原因。
作为 HTTP 缓存代理,Squid 是一种可以显着减少后端系统负载同时确保缓存数据是最新的实现。
该标准允许定义项目在重新验证之前可以缓存多长时间,以及如何发出条件请求,因此只有新版本才会响应请求而发送。所有这些客户端行为已经在浏览器和主要语言使用的 HTTP 客户端中实现,例如 Java 的 Apache HttpComponents Client 和 accompanying caching library。
由于现在所有这些机制都已明确定义和实现,因此使用它实际上只是使用这些组件的问题,其中大部分您可能已经在使用(例如,在撰写本文时,Apache HC 组件是SpringBoot 附带的默认实现 - 只需将缓存库添加到构建中)。
如果您要使用 MemCache 或 Redis 来实现这一点,那么您只是在重新发明轮子,并且从那时起必须重复维护该自定义代码的负担。而且,如果您没有在代码中实现 RFC 2616 的等效项,您将使用过时的数据和低效的通信。
【讨论】: