16.2.5 内存缓存常见问题解答

16.2.5.1。 memcached 可以在 Windows 环境下运行吗?
16.2.5.2。 您可以在 memcached 中存储的对象的最大大小是多少?那是可配置的吗?
16.2.5.3。 memcached 对于 db-read-intensive 应用程序比对于 db-write-intensive 应用程序更有效是真的吗?
16.2.5.4。 不使用持久连接是否有任何开销?如果始终建议持久化,那么缺点是什么(例如,锁定)?
16.2.5.5。 memcached 客户端如何处理诸如其中一个 memcached 服务器崩溃之类的事件?
16.2.5.6。 Memcached 服务器的推荐硬件配置是什么?
16.2.5.7。 与文本读/写相比,memcached 对视频和音频更有效吗?
16.2.5.8。 memcached 可以与 ASPX 一起工作吗?
16.2.5.9。 建立内存缓存连接的成本是多少?这些连接应该合并吗?
16.2.5.10。 当 memcached 服务器宕机时,数据是如何处理的?
16.2.5.11。 MySQL 数据库中的自增列如何跨多个 memcached 实例进行协调?
16.2.5.12。 压缩可用吗?
16.2.5.13。 我们能否将不同类型的memcached实现为同一台服务器中的不同节点,那么同一台服务器中是否可以有确定性和非确定性呢?
16.2.5.14。 测试实施、确保其提高性能以及衡量 memcached 配置更改的影响的最佳实践是什么?你会建议保持配置非常简单吗?

16.2.5.1。

memcached 可以在 Windows 环境下运行吗?

不可以。目前memcached仅在 Unix/Linux 平台上可用。有一个非官方端口可用,请参阅http://www.codeplex.com/memcachedproviders

16.2.5.2。

您可以在 memcached 中存储的对象的最大大小是多少?那是可配置的吗?

默认的最大对象大小为 1MB。在 memcached-I 1.4.2 及更高版本中,您可以使用命令行选项 更改对象的最大大小。

对于在此之前的版本,要增加此大小,您必须重新编译memcached。您可以修改源文件内的 POWER_BLOCK值 。slabs.c

memcached 1.4.2 及更高版本中,您可以使用 -I命令行选项配置支持的最大对象大小。例如,要将最大对象大小增加到 5MB:

$ memcached -I 5m

如果对象大于最大对象大小,则必须手动拆分它。memcached非常简单:您给它一个键和一些数据,它会尝试将其缓存在 RAM 中。如果您尝试存储超过默认的最大大小,则出于速度原因,该值将被截断。

16.2.5.3。

memcached与数据库写入密集型应用程序相比,数据库读取密集型应用程序是否更有效 ?

是的。memcached在数据库写入中不起作用;它是一种缓存已从 RAM 中的数据库中读取的数据的方法。

16.2.5.4。

不使用持久连接是否有任何开销?如果始终建议持久化,那么缺点是什么(例如,锁定)?

如果在与memcached 通信时不使用持久连接 ,则每次打开连接的延迟会有少量增加。效果与使用 MySQL 的非持久连接相当。

通常,持久连接发生锁定或其他问题的可能性很小,因为memcached中几乎没有锁定。如果出现问题,最终您的请求会超时并且不会返回任何结果,这意味着您的应用程序必须再次从 MySQL 加载。

16.2.5.5。

memcached客户端如何处理 诸如其中一个 memcached服务器 崩溃之类的事件?

没有自动处理这个。如果您的客户端无法从服务器获得响应,请编写回退机制以从 MySQL 数据库加载数据。

客户端 API 都提供了动态添加和删除 memcached实例的能力。如果在您的应用程序中您注意到memcached 服务器不再响应,您可以从服务器列表中删除该服务器,密钥会自动重新分配到列表中的另一个memcached服务器。如果在所有服务器上保留缓存内容很重要,请确保使用支持一致哈希算法的 API。有关详细信息,请参阅 第 16.2.2.5 节,“ memcached哈希/分布类型”

16.2.5.6。

Memcached 服务器的推荐硬件配置是什么?

memcached的处理开销非常低。所需要的只是备用物理 RAM 容量。Memcached服务器不需要 专用机器。如果您有具有备用 RAM 容量的 Web、应用程序或数据库服务器,则将它们与 memcached一起使用。

要构建和部署专用的memcached 服务器,请使用相对低功耗的 CPU、大量 RAM 和一个或多个千兆以太网接口。

16.2.5.7。

与文本读/写相比,memcached 对视频和音频更有效吗?

memcached适用于所有类型的数据。对于memcached,您存储的任何值都只是一个数据流。不过请记住,您可以在memcached中存储的对象的最大大小为 1MB,但可以通过使用 memcached 1.4.2 及更高版本-I中的选项如果您计划将memcached用于音频和视频内容,您应该增加最大对象大小。还记得memcached是一种用于缓存阅读信息的解决方案。它不应该用于写入,除非更新缓存中的信息。

16.2.5.8。

memcached 可以与 ASPX 一起工作吗?

许多语言和环境都有端口和接口。ASPX 依赖于一种底层语言,例如 C# 或 VisualBasic,如果您使用的是 ASP.NET,则可以使用 C# memcached库。有关详细信息,请参阅 https://sourceforge.net/projects/memcacheddotnet/

16.2.5.9。

建立内存缓存连接的成本是多少?这些连接应该合并吗?

打开连接的成本相对较低,因为在您可以开始发送请求和获取结果之前没有进行安全、身份验证或其他握手。大多数 API 支持与memcached实例的持久连接以 减少延迟。连接池将取决于您使用的 API,但如果您直接通过 TCP/IP 进行通信,则连接池将提供一些小的性能优势。

16.2.5.10。

当memcached 服务器宕机 时,数据是如何处理的?

该行为完全取决于应用程序。大多数应用程序回退到从数据库加载数据(就像它们正在更新memcached 信息一样)。如果您使用多个 memcached服务器,您还可以从列表中删除一个关闭的服务器以防止它影响性能。否则,客户端会继续尝试与与您尝试加载的密钥相对应 的memcached服务器通信。

16.2.5.11。

MySQL 数据库中的自增列如何跨多个 memcached 实例进行协调?

他们不是。MySQL 和memcached之间没有任何关系, 除非您的应用程序(或者,如果您使用 MySQL 可加载 memcached函数,您的数据库定义)创建一个。

如果您将基于自动递增键的信息存储到memcached的多个实例中,则该信息无论如何只会存储在其中一个 memcached实例中。客户端使用键值来确定哪个memcached 实例存储信息。它不会在所有实例中存储相同的信息,因为那样会浪费缓存内存。

16.2.5.12。

压缩可用吗?

是的。大多数客户端 API 都支持某种类型的压缩,有些甚至允许您指定阈值,在该阈值下,某个值被认为适合在存储期间进行压缩。

16.2.5.13。

我们能否将不同类型的memcached实现 为同一台服务器中的不同节点,那么同一台服务器中是否可以有确定性和非确定性呢?

是的。您可以在单个服务器上运行多个 memcached实例,并在客户端配置中选择要使用的服务器列表。

16.2.5.14。

测试实施、确保其提高性能以及衡量 memcached配置更改的影响的最佳实践是什么?你会建议保持配置非常简单吗?

测试性能的最佳方法是启动一个 memcached实例。首先,修改您的应用程序,使其在数据即将被使用或显示到memcached之前存储数据。由于 API 处理数据的序列化,因此它应该只是对代码的一行修改。然后,使用从memcached请求数据的代码修改通常从 MySQL 加载该信息的进程的开始 。如果无法从 memcached加载数据,则默认为 MySQL 进程。

所需的所有更改不需要很多代码行。要获得最大收益,请确保缓存整个对象(例如,网页、博客文章、讨论线程等的所有组件),而不是将 memcached用作 MySQL 表的单个行的简单缓存。

使用memcached 可以轻松地在开始时甚至长期保持配置简单。一旦基本结构启动并运行,通常唯一正在进行的更改是将更多服务器添加到应用程序使用的服务器列表中。你不需要管理 memcached服务器,也没有复杂的配置;只需将更多服务器添加到列表中,让客户端 API 和memcached服务器做出决定。