【发布时间】:2013-08-16 01:57:58
【问题描述】:
假设我有一个带有 id -> 字符串的大(MySQL-)表(>10k 行)。我可以将它们全部放在一个数组中并缓存这个数组。但问题来了:如何高效缓存?
a) 将其缓存为一个大项目。所以我会执行
$redis->set("array", $array);
相当简短和容易。但是对于我需要的每个条目,我都必须获取整个内容。绝对低效。
b) 缓存每个条目本身:
foreach( $array as $id => $str )
$redis->set( "array:$id", $str );
使用这种方式,我将在 Redis 中拥有 >10k 条目。那感觉不太好。如果我有 10 个这样的表,我将有 100k 个条目....
那么你的建议是什么?如何缓存一个大数组?
【问题讨论】:
-
用例:我一次只需要一个条目。
-
为什么需要在Redis中缓存一整张数据库表,为什么不直接使用原始数据库表中的数据?
-
1) id 和 string 只是其中的两列。 2)数据库流量大,我想减少负载。 3)这不是缓存的意义吗 - 如果经常使用,可以缓冲 DB-Data 吗? 4) Redis 是纯内存的,位于 webserver 的机器上,DB 在集群中自己的机器上。
-
Well 数据库对经常访问的记录有自己的缓存;但是如果数据库流量很大,那么确保它被正确索引 - 外部缓存对于存储需要很长时间运行的常规、相对静态的查询的结果是有益的,但如果数据库访问不慢(取决于你的查询),但是在没有聚合/等的情况下检索单个记录的简单索引查询不应该比 redis 访问慢...
-
... 即使您的 redis 在物理上位于同一台服务器上,它仍然像通过网络请求一样被请求,所以您唯一要节省的是网络延迟;但增加了缓存验证、未命中后备等的开销