文章、博客、商品等性能常常须要一个字段统计用户的点击量(访问量),该字段通常须要长久化到数据库中,但数据库是不适宜间接应答用户操作,这种场量如何实现高负载?
支流的零碎高负载解决方案,通常把数据同步到分布式的 ES,多节点的 Redis 集群中。但点击量这个字段,须要在页面中实时展现,用户刷新页面时,须要直观的看到点击量的变动。
咱们首先能想到的,是将点击量间接存入 Redis,展现页面时从 Redis 实时读取,并实时累加,
键名格局:
article : [id] : hits
键值格局:点击量
这样设计仅为满足点击量性能问题不大,俚进一步的需要来了:热门文章,热门商品等性能,须要跟据点击量进行排序,或者聚合更多字段进行查问。因而,点击量还是是须要更新到数据库和 ES 中的。但又不能实时更新,因而能够在 redis 存储点击量时,减少一个计数器,当计数器未达到临界值时,仅累加 Redis,不写入数据库,当计数器达到临界值时,写入数据库,计数器归 0
键名格局:
article : [id] : hits
示例值:article:10:hits
键值格局:
点击量, 计数器
示例值:123,10,示意以后点击量为 123,计数器为 10
下次访问后,示例值变为:124,11,示意以后点击量为 124,11,计数器为 11。当计数器值达到 1000 时(示例值为:1113,1000),计数据归 0(1113,0),将 1113 更新到数据库并触发 ES 更新
流程图如下:
另外,还能够进一步简化设计,不设置计数器,用点击量取模临界值(点击量 % 临界值 === 0),余数为 0 时更新数据库。
本文原始网址:https://www.liu12.com/article…,转载请保留出处