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