PHP:如何在redis中缓存一个大表?

时间:2013-08-14 08:03:37

标签: php mysql caching redis

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

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

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

非常简短。但是对于我需要的每个条目,我必须抓取整个事情。绝对低效。

b)缓存每个条目

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

使用这种方式,我将在Redis中拥有> 10k条目。那感觉不舒服。如果我有10个这样的表,我将有10万个条目......

那你的建议是什么?如何缓存大数组?

2 个答案:

答案 0 :(得分:2)

如果您计划从整体上检索它,那么缓存大数组只会有所帮助。但是,当您更改必须使整个阵列无效并从DB重新读取它时,高速缓存失效将是一个非常“繁重”的操作。

redis中的10k并不多。您可以毫无问题地拥有数百万条记录。

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

答案 1 :(得分:0)

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

如果你总是需要整个阵列,那么:

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

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

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

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

另外,请记住redis是一个单独的服务器。对于每个redis请求,都会向此服务器发出请求(在localhost上或不在localhost上)。 基本上,redis的规则与mysql相同:一个大请求的执行速度比许多小请求快。