2

假设我有一个带有 id -> 字符串的大(MySQL-)表(>10k 行)。我可以将它们全部放在一个数组中并缓存这个数组。但问题是:如何有效地缓存它?

a) 将其缓存为一个大项目。所以我会执行

$redis->set("array", $array);

很短很容易。但是对于我需要的每个条目,我都必须获取整个内容。绝对低效。

b)缓存每个条目本身

foreach( $array as $id => $str )
  $redis->set( "array:$id", $str );

使用这种方式,我将在 Redis 中拥有超过 10k 个条目。那感觉不太好。如果我有 10 个这样的表,我将有 100k 个条目....

那么你的提议是什么?如何缓存一个大数组?

4

2 回答 2

2

如果您打算始终将其作为一个整体进行检索,那么缓存大数组只会有帮助。但是,缓存失效将是一个非常“繁重”的操作,因为当您更改某些内容时,您必须使整个数组无效并从数据库中重新读取它。

redis 10k 根本不算多。您可以毫无问题地拥有数百万个条目。

我会选择 b) 版本。单独缓存每个条目。更容易维护,更简单的应用程序代码和更小的应用程序端的内存占用,当你想要扩展你的应用程序时,这变得越来越重要。

于 2013-08-14T08:23:55.833 回答
0

第一个问题是:为什么需要缓存该数组。

如果你总是需要整个数组,那么:

$redis->set("array", $array);

如果您只需要一些特定的索引(第二个解决方案),那么为什么要尝试缓存整个事物而不是每次都查询数据库以获取所需的 id。只获取所需的数据总是更有效。

请记住,使用读取(从缓存中有效读取的项目)和未命中(从数据源读取然后添加到缓存的项目)之间的比率来估计缓存的有用性。

如果您正在缓存整个表(10k 未命中),但仅通过 id 查询少数元素(2de 解决方案),那么您的比率接近于零。如果您每次都需要整个表,则使用第一个解决方案 (1miss) 对其进行缓存,因此您的比率更有可能 > 1。

另外,请记住,redis 是一个单独的服务器。对于对 redis 的每个请求,都会向该服务器发出一个请求(在本地主机上或不在本地主机上)。所以基本上 redis 和 mysql 的规则是一样的:一个大请求比许多小请求执行得更快。

于 2013-08-14T08:23:14.813 回答