【发布时间】:2012-11-08 07:29:21
【问题描述】:
在网络服务器和应用服务器之间应用缓存层的好工具是什么。
基本要求:
- 应用程序服务器需要一种方法来从缓存中删除项目,并将项目放入缓存中并设置过期日期。
- 网络服务器需要一种以非常轻量级、快速的方式从缓存中提取项目的方法,而无需在应用服务器上分配线程。
- 它不一定需要是分布式缓存(可从多台机器访问),但不会有什么坏处。
我考虑过的策略:
- 静态文件缓存。请求进来,被散列,如果文件存在我们提供它,如果不存在,我们将请求路由到应用服务器。高 I/O 是并发问题还是文件锁定问题?由于内存中的内核级缓存,文件系统实际上非常快,这是否准确。
- 使用 mongodb 或 redis 等键值数据库。这会将完成的 HTML/JSON 片段存储在 db 中。如果需要,网络服务器将能够从数据库中读取数据并路由到应用服务器。应用服务器将配备从数据库中插入/删除。
- 像 memcached 或 Varnish 这样的内存缓存(不太了解 Varnish)。我对 memcached 的唯一担心是我想要在任何给定时间缓存 3 到 10 GB 的数据,这超出了我在内存中可以安全分配的数量。 memcached 是否有方法溢出到文件系统?
在尝试这种类型的缓存层时对一些技术和陷阱有什么想法吗?
【问题讨论】:
-
Mongodb/redis 可以轻松缓存一些数据,尤其是来自 SQL 的查询(这大致是 twitter 对 cassandra 所做的)。通常,我发现一个不错的选择是将 MongoDB/redis 等半永久缓存与 memcached 混合,在 memcached 中保留小热点以提高速度,但通过在 mongodb/redis 中存储更大的聚合信息来提高速度
-
从 memcache 提供数据和从 MongoDB/Redis 提供数据之间没有显着差异,前提是后一个选项将它放在内存中(当数据足够热时,MongoDB 会这样做,而不是 100% 在 Redis 上,但我相信如此)。 memcache 的另一个小问题是它是分布式的,但不一定是复制的。如果 memcache 节点出现故障,则必须冷启动,这可能会给您带来问题。
-
如果它是相关的,我不想缓存“数据”。在大多数情况下,缓存将是完整呈现的 HTML 或 HTML 片段。这并不是真正意义上的减少 SQL 查询的方法。这是一种减少整个应用程序堆栈负载的方法,但将缓存层移至网络服务器。
-
您需要缓存 10GB 的 HTML?这……很多,你确定你不考虑缓存不需要的页面吗?
-
@sammaye 我认为 10gb 是我们计划永远不会达到但可以达到的最高端。如果我们估计每页 30k x 40 个站点 x 1250 个页面 = 10gb,这不太可能但可能。无论哪种方式,都超出了完全存储在内存中的合理范围,对吧?
标签: mongodb caching iis coldfusion memcached