【问题标题】:Storing million key-value in memcached -- good or bad idea?在 memcached 中存储百万键值 - 好主意还是坏主意?
【发布时间】:2026-01-09 12:20:10
【问题描述】:

我正在考虑将 memcached 与我的 PHP 应用程序结合使用来存储 500 万个键值对。我的目标是避免从数据库(在我的例子中是文件系统)来回。我每秒可能对键值进行 100-500 次访问。键值都是 MD5,格式为:

array( 'MD5X' => 'MD5Y', ... )

我不确定数据是如何存储的,但如果我们将 5 million * 16 bytes (keys) + 5 million * 16 bytes (values) 相乘,我们会得到 ~180MB。

(编辑:在尝试使用真正的 memcached 实例后,我用了 750MB 来存储所有项目。)

数据集是固定的,所以我只会从中读取。

问题:

  1. 这是好的还是坏的设计?
  2. 能否强制 memcached 永远(除非服务器崩溃)重新加载数据?假设内存上限高于存储的数据?如果不是,我可以采用哪些技术来实现相同的目标。

非常感谢!

【问题讨论】:

  • 您应该针对您的特定用例进行性能分析。或者考虑使用一个真正的数据库,因为它会内置缓存。如果你存储一个数组,你不需要拉整个数组来查看它吗?
  • 感谢@PaulCollingwood,不幸的是我不能使用数据库。干杯

标签: memcached


【解决方案1】:

您能获得所需的性能吗?确实。 Memcache 的速度非常快。 我们存储了大约 1000 万个密钥,并且每秒访问 memcache 大约 700 次。它从未让我们失望过。

您可以在启动应用程序时加载 memcache 中的所有键并将过期日期设置为很长的时间。您必须记住的是,memcache 最终是一个缓存。它不应该用作存储引擎。您必须将其设计为始终有可能找不到您需要的数据(密钥),并在这种情况下进行数据库调用。

您可以查看像 cassandra 这样的 noSQL 数据库,它具有出色的读写速度,可以满足您的需求。唯一的问题是,与 memcache 相比,微调 cassandra 有点困难。

【讨论】:

  • 谢谢。根据我的理解,只要我没有内存或平板问题,只要不指定过期,条目就永远不会过期。由于我没有后面的数据库(并且我不想引入新的库/等)并且我没有足够的磁盘空间来使用文件系统,我正在考虑使用一个手动迭代和加载的巨大数组服务器启动后进入 memcached。如果在 memcached 中找不到条目,​​我将默认为另一种行为,或者可能考虑从数组中读取,但我害怕并发并杀死服务器。