首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:如何在redis中缓存一个大表?

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

Stack Overflow用户
提问于 2013-08-14 08:03:36
回答 2查看 3.2K关注 0票数 2

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

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

代码语言:javascript
复制
$redis->set("array", $array);

很短很容易。但我需要的每一个条目,我都得把整件东西拿来。完全没有效率。

b)缓存每个条目本身

代码语言:javascript
复制
foreach( $array as $id => $str )
  $redis->set( "array:$id", $str );

使用这种方式,我将在Redis中获得>10k条目。感觉不太好。如果我有10张这样的桌子,我将有100 k条目.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-14 08:23:55

缓存大数组只有在您计划将其作为一个整体来检索时才会有帮助。然而,缓存失效将是一个非常“沉重”的操作,就像在任何时候更改某些东西一样,您必须使整个数组失效并从DB中重新读取它。

10k的红宝石一点也不贵。您可以拥有数百万的条目,没有问题。

我会同意b)的版本。分别缓存每个条目。维护起来更容易,应用程序代码更简单,来自应用程序端的内存占用也更小,这在您想要扩展应用程序时变得越来越重要。

票数 2
EN

Stack Overflow用户

发布于 2013-08-14 08:23:14

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

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

代码语言:javascript
复制
$redis->set("array", $array);

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

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

如果您正在缓存整个表(10k误),但是只通过id (2de解决方案)查询几个元素,那么您的比率接近于零。如果每次都需要整个表,那么使用第一个解决方案( 1次失败)来缓存它,这样您的比率就更有可能大于1。

此外,请记住,redis是一个单独的服务器。对于每个对redis的请求,都会向此服务器发出请求(无论是否在本地主机上)。因此,对于redis来说,这是与mysql相同的规则:一个大请求的执行速度将比许多小请求快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18226249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档