7

我正在开发一个网上商店类型的应用程序。我经常在其他网站上看到的一个功能是过滤选项的细分,然后是过滤选项总共有多少结果。您经常在计算机网站(例如 Newegg)或二手车网站上看到这一点。例子:

CPU:
  * AMD (315)
  * Intel (455)

Video card:
  * ATI (378)
  * Nvidia (402)

我怎样才能有效地计算这些总数?我工作的网站将有许多不同的产品(10.000+),有许多不同的选项。更糟糕的是,产品在不断变化。

试图预先计算所有不同的过滤组合总数似乎是不可行的。如果我有 5 个不同的过滤器,每个过滤器有 4 个选项,则选项可能性的数量为20 * 16 * 12 * 8 * 4 = 122880. 这需要很长时间才能计算出来。

另一种选择是按需查询并缓存结果(例如在 Redis 中)。但是,如果产品不断被添加和删除,我如何有效地管理缓存呢?缓存通常是陈旧的。恐怕我不得不以某种方式对缓存失效进行微观管理,从而导致实现非常复杂和脆弱。另一种方法是使缓存的广泛部分无效。但是在失效后,我的数据库将被来自需要重新计算这些总数的活跃用户的数百个查询所冲刷。

有没有一种优雅而优雅的方式来处理这个问题?

4

2 回答 2

3

我认为为您的案例显示实时数据没有问题。不要以任何方式阻止您,但 10K 产品并不是很多,性能明智。另一方面,数百万是。

您是否真的尝试以这种方式实现它并发现它运行缓慢,或者您只是过度关注它的理论性能?我建议您按原样对系统进行一些压力测试,看看是否值得改进。不过,这里有一些想法可以让它更快:

  1. 不要一次填充所有计数,仅在展开/单击特定类别时。所以你总是会得到一个SELECT cat_name, COUNT(*) GROUP BY cat_name查询,这不应该占用太多时间。像这样每次用户点击的单一且相对较轻的查询对我来说听起来很合理。

  2. 让数据库引擎为您管理缓存。如果您经常执行类似的查询,您的数据库引擎应该自动优化底层存储(即将整个表移动到内存或类似的)。您只需要确保实例有足够的内存。

  3. 如果需要,升级服务器硬件。如果数据量增加,您可能没有足够的内存来存储所有内容。不要慌,你仍然可以在服务器中放入 SSD,或者在服务器中安装 12 核 Xeon 处理器,具体取决于瓶颈所在。

于 2012-11-04T19:49:20.193 回答
0

以其他方式思考并将数字保存在数据库中怎么样?您可能会使用触发器自动增加/减少计数器,以防产品被添加到给定类别中/从给定类别中删除(如果没有,它仍然可以由允许商店经理添加/删除销售产品的对话框显式处理) .

这似乎是一个很好的解决方案,因为a)我认为类别的名称已经存储在数据库中,因此询问数字会产生很少的开销,并且b)即使产品不断变化,它们很可能会发生很大变化频率低于请求频率(即使用户自己可以添加/删除产品,该频率仍然有效)。最后 c) 没有复杂的缓存方案,计数器由代码的单个部分在一个地方管理。应该很容易保持它没有错误。

于 2012-11-04T19:21:16.067 回答