使用PHP进行Memcache get优化

3
好的,我有一些关于Memcache的奇怪问题。我的缓存技术的基本思想是将PHP脚本请求的数据保存在Memcached服务器中。我和我的团队面临的主要问题是,有时保存大量数据可能会超过Memcached中项目数据大小的1MB限制。
为了进一步解释这种方法,请想象以下情况: 我们有很多数据来配置某个对象,这些数据包含很多文本和数字等。我们需要保存近200个这些对象,所以我们首先采用的方法是将所有200个对象缓存到Memcached中的一个大项目中。该项目可能会超过1MB的限制,因此我们可以采用新的方法。
我们采用的新方法是将配置对象的数据分解成较小的构建块(由于我们不在同一页上使用所有数据),然后我们将使用较小的构建块来获取我们在特定页面中使用的确切数据量。
问题如下: 当你获取更大的数据时,GET速度是否会改变?或者Memcached服务器并行处理请求数量的限制是否会妨碍第二种方法,因为我们将使用多个GET来获取配置对象的多个构建块?
我知道这是一个奇怪的问题,但对于我们正在采用的新方法至关重要,因为它将确定我们将使用的构建块的大小以及我们是否需要添加数据。
编辑1: 请注意,我们可以使用第二种方法的MULTIGET函数,因此我们不必连接到Memecached并等待每个获取的数据的响应。因此,将使用并行请求来获取多个键。
1个回答

3

不要深究“你在memcache中存储了什么以及为什么不使用其他解决方案(比如带有内存表存储引擎的数据库)”,我想说多个请求的成本确实是一个问题,特别是当memcached运行在远程节点/主机上时。一个大对象的单个请求通常更快——你仍然需要传输相同数量的数据,但不会有额外的单独请求开销相对于200个片段。

顺便说一下,如果你使用APC并且没有许多这些巨大的项目,你可以使用它来代替memcache进行本地用户级内存缓存——最大大小可以通过php配置设置轻松调整。你将无法获得跨主机的分布式访问/共享的好处,但它快速简单。


我认为他试图这样做实际上会更快。不是存储一个庞大的单一对象并获取大量不会使用的数据,而是一次计算整个内容,并按页面的需要进行拆分。这意味着当他从memcache中获取时,他只会得到所需的内容(更少的数据),而且仍然是单个请求。不过,我同意“你到底在存储什么”的看法。 - hukir
我们在memcache中存储什么并不重要,只是一些用于识别数据库对象的数据。我想利用memcache的速度进行优化。假设我需要页面1的项目x、y和z,以及页面2的项目x、y、z、a、b和c。整个想法是将x、y、z保存在一个memcache键中,将a、b、c保存在另一个memcache键中。哪种方法更好?这种方法还是只将x、y、z、a、b和c保存在一个memcache键中,并在一个请求中检索整个内容? - Bola
@Bola 如果你总是需要整个组件集,那么单个请求将更有效率。 - Ray
@hukir的问题指向始终拉回整个数据集,而不是子集。 - Ray
这是问题的主要关键。如果我不打算使用全部数据,是选择为多个块进行MULTIGET还是只获取一个大块的数据更好? - Bola
1
@Bola 取决于所需数据量。 如果只需要 10% 的块,则多次获取是正确的方法。但是,如果使用大部分数据,则单个获取会更好。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接