假设我有一个带有id ->字符串的大型(MySQL-)表(>10k行)。我可以把它们都放在一个数组中,并缓存这个数组。但问题是:如何有效地缓存它?
a)将其缓存为一个大项目。所以我会执行
$redis->set("array", $array);很短很容易。但我需要的每一个条目,我都得把整件东西拿来。完全没有效率。
b)缓存每个条目本身
foreach( $array as $id => $str )
$redis->set( "array:$id", $str );使用这种方式,我将在Redis中获得>10k条目。感觉不太好。如果我有10张这样的桌子,我将有100 k条目.
那你的建议是什么?如何缓存一个大数组?
发布于 2013-08-14 08:23:55
缓存大数组只有在您计划将其作为一个整体来检索时才会有帮助。然而,缓存失效将是一个非常“沉重”的操作,就像在任何时候更改某些东西一样,您必须使整个数组失效并从DB中重新读取它。
10k的红宝石一点也不贵。您可以拥有数百万的条目,没有问题。
我会同意b)的版本。分别缓存每个条目。维护起来更容易,应用程序代码更简单,来自应用程序端的内存占用也更小,这在您想要扩展应用程序时变得越来越重要。
发布于 2013-08-14 08:23:14
第一个问题是:为什么需要缓存该数组。
如果您总是需要整个数组,那么:
$redis->set("array", $array);如果您只需要一些特定的索引(第二个解决方案),那么为什么要尝试缓存整个过程,而不是每次查询数据库以获得所需的id。只获取所需的数据总是更有效。
请记住,缓存有用性是使用读取(从缓存有效读取的项)和遗漏(从数据源读取的项然后添加到缓存)之间的比率来估计的。
如果您正在缓存整个表(10k误),但是只通过id (2de解决方案)查询几个元素,那么您的比率接近于零。如果每次都需要整个表,那么使用第一个解决方案( 1次失败)来缓存它,这样您的比率就更有可能大于1。
此外,请记住,redis是一个单独的服务器。对于每个对redis的请求,都会向此服务器发出请求(无论是否在本地主机上)。因此,对于redis来说,这是与mysql相同的规则:一个大请求的执行速度将比许多小请求快。
https://stackoverflow.com/questions/18226249
复制相似问题