我正在开发一个网上商店类型的应用程序。我经常在其他网站上看到的一个功能是过滤选项的细分,之后总共过滤选项会有多少结果。您经常在计算机网站(例如Newegg)或二手车网站上看到此信息。例如:
CPU:
* AMD (315)
* Intel (455)
Video card:
* ATI (378)
* Nvidia (402)
如何有效地计算这些总数?我正在研究的网站将有许多不同的产品(10.000+),有许多不同的选择。更糟糕的是,产品不断变化。
尝试预先计算所有不同的过滤组合总数似乎是不可行的。如果我有5个不同的过滤器,每个过滤器有4个选项,则选项可能性的数量为20 * 16 * 12 * 8 * 4 = 122880
。计算它需要很长时间。
另一种选择是按需查询并缓存结果(例如在Redis中)。但是,如果不断添加和删除产品,我怎么能有效地管理缓存呢?缓存通常是陈旧的。我担心我必须以微观方式管理缓存失效,从而导致一个非常复杂和脆弱的实现。另一种方法是使广泛的缓存部分无效。但是,在失效之后,我的数据库会被需要重新计算这些总数的活跃用户的大量查询所匆匆忙忙。
有没有一种漂亮而优雅的方式来处理这个问题?
答案 0 :(得分:2)
我认为为您的案例显示实时数据没有问题。不要以任何方式阻止你,但10K产品并不是很多,性能明智。另一方面,数百万是。
你是否真的试图以这种方式实现它并发现它表现得很慢,或者你只是过于关注它的理论性能?我建议你按原样对你的系统进行一些压力测试,看看它是否值得改进。不过,以下是一些让它更快的想法:
只有在展开/点击特定类别时,才能一次填充所有计数。因此,您最终会得到一个SELECT cat_name, COUNT(*) GROUP BY cat_name
查询,这不会占用太多时间。对于每个用户点击,单个和相对较轻的查询对我来说听起来很合理。
让数据库引擎为您管理缓存。如果经常执行类似的查询,则数据库引擎应自动优化底层存储(即将整个表移动到内存或类似内容)。您只需要确保实例有足够的内存。
升级服务器硬件(如果需要)。如果数据量增加,您可能没有足够的内存来存储所有内容。不要惊慌,你仍然可以放入SSD,或者将12核Xeon处理器安装到服务器中,具体取决于瓶颈所在。
答案 1 :(得分:0)
如何从其他方式思考并保持数据库中的数字?如果在给定的导管中添加/删除产品,您可以使用触发器自动增加/减少计数器(如果没有,它仍然可以通过允许商店经理添加/删除产品的对话框明确处理)
这似乎是一个很好的解决方案,因为a)我认为导管的名称已经存储在数据库中,因此要求数字产生的开销非常小,而且b)即使产品不断变化,它们也很可能以比请求频率低得多的频率进行更改(即使用户自己可以添加/删除产品,仍然保持不变)。最后c)没有复杂的缓存方案,计数器由单个部分代码在一个地方进行管理。应该很容易保持它没有错误。