0

我正在寻找更好的解决方案。

我有一个拥有 200.000 多个用户和大量 SQL 查询的社区。它们中的大多数在其结果中都包含一个用户 ID。在大多数情况下,我需要在输出中使用相关的用户名来解决。

[userId - username] 是一个单独的表。为了避免对这个表进行大量的连接,我决定将洞表作为一个数组缓存在 memcacheD 中。这在开始时工作得很好。SQL 服务器负载下降了很多。一切都比以前运行得更快。

但是,几周后,hole server-cluster (5 webserver) 出现了问题。缓存的用户 ID 用户名数据集变得巨大。以至于我在网络接口达到了内部 1000Mbit 数据限制,而 memcacheD 正在将记录发送到请求服务器。我试图序列化数据,但它并没有改变战利品。

我现在看到三种方法:

1) 强制 memcacheD 缓存每台服务器上的记录。所以集群不需要向其他服务器请求缓存。但是数据集的每一次更改都需要在每台服务器上同时完成。- 无论如何,我不知道这是否可能。

2) 切换回 JOINS 并使用 cacheexecute。

3)你有一个更好的解决方案!:)

4

1 回答 1

0

似乎您正在以不打算使用的方式使用缓存。Memcached 最适合用作键值存储,而不是存储单个大数据元素的地方。我真的会考虑您是否真的需要在每个单独的调用中使用整个数组,或者您是否重新构建数据访问模式以简单地检索满足您的请求所需的数据。换句话说,如果您有用户名(例如登录名)并且需要获取用户 ID,只需对该用户名进行密钥查找以仅获取所需的用户 ID。

然而,在这种情况下,我真的不明白你在 Memcached 中拥有用户 ID/用户名数据会获得什么。您是否遇到过重复命中相同用户 ID 的情况,从而真正最大限度地利用缓存中的数据?您是否不担心将这些数据存储在内存中而不是在某种数据持久层中存储在磁盘上的波动性?

我想我真的需要更多地了解您的用例以提供更具体的建议,但是尝试存储和检索整个数据数组似乎很奇怪。

于 2013-01-11T17:53:38.677 回答