发布者:上海IT外包来源:http://www.lanmon.net点击数:1080
我们在用户看到这个评论的时候,很难想象总共能统计出有多少赞词。 举个例子,向老虎发表评论,每当有人赞成,就在评论下面加上赞词记录,记录谁赞成。 当某人访问此注释时,可以使用MySQL select count语句对其进行统计,查看记录的总数,然后返回到上一页。
这个方案有什么样的问题呢?在数据量很少的情况下,我们能够非常迅速的计算出结果。 但是,随着数据量的增长,例如非常受欢迎的评论,可能已经被赞扬了几十万件,每次的查询效率都不高。 评论的内容是核心数据,评论的分数是子数据,如果查询分数花费太长时间,反而会影响主要业务。 我们要做的是尽量减少查询,加快查询速度。
在以往的方案中,我们每次都是Count次,就像能不能保存这个数据一样,没有必要每次有人来询问时都进行统计。 每次进行更改时,对数据库执行selectCount,查询后保存结果。
然后,每次有人访问此注释时,SelectCount都会立即返回,而无需执行任何选择计数。 当然,每次去SelectCount也是愚蠢的方法,为什么每次都不称赞呢? 如果有人取消评分的话会减分吗? 称赞数据的电话分为1和-1两个事件。 当然,这种方法的潜在风险点是同时问题,比如原始数据是5,突然来了两个1的要求,由于他们同时执行。
在这种情况下,必须锁定以防止合并,或在数据库中实现。
仅仅这些是不够的。 如何面对突发流量? 例如,突然发生热点事件,突然发出评论,10分钟内可能有数万件赞赏。 我们每次更新数据库都会大大降低效率。 为了应对这些突发流量,行业内的解决方案是众所周知的,难道不是使用消息队列来消除峰值吗? 但是,这种突发流量容易导致MQ的堆积,有什么好办法吗? 其实很简单,本来我们要做10次1次的操作,为什么我们不整合成1次10次的操作呢? 这样可以大大减少数据库的压力。 我们一般有两种常见的实现方法。 一种方法是将任务集成到异步队列中,另一种方法是将计数存储在高速缓存中,并定期将数据刷新到数据库。分享到: