继续答星球水友提问,30WQPS的点赞计数业务,如何设计?
10年积累的成都网站制作、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计制作后付款的网站建设流程,更有乌海海南免费网站建设让你可以放心的选择与我们合作。
可以看到,这个业务的特点是:
画外音:计数有微小不准确,不是大问题。
先用最朴素的思想,只考虑点赞计数,可以怎么做?有几点是最容易想到的:
此时MySQL核心数据结构是:
- t_count(msg_id, praise_count)
此时redis的KV设计也不难:
似乎很容易就搞定了:
计数系统的难点,还在于业务扩展性问题,以及效率问题。
以微博为例:
假如用最朴素的方式实现,多条消息多个计数的获取伪代码如下:
- // (1)获取首页所有消息msg_id
- list
= getHomePageMsg(uid); - // (2)对于首页的所有消息要拉取多个计数
- for( msg_id in list
){ - //(3.1)获取阅读计数
- getReadCount(msg_id);
- //(3.2)获取转发计数
- getForwordCount(msg_id);
- //(3.3)获取评论计数
- getCommentCount(msg_id);
- //(3.4)获取赞计数
- getPraiseCount(msg_id);
- }
由于同一个msg_id多了几种业务计数,redis的key需要带上业务flag,升级为:
- msg_id:read
- msg_id:forword
- msg_id:comment
- msg_id:praise
用来区分共一个msg_id的四种不同业务计数,redis不能支持key的模糊操作,必须访问四次reids。
假设首页有100条消息,这个方案总结为:
画外音:这种方案的扩展性和效率是非常低的。
那如何进行优化呢?
首先看下数据库层面元数据扩展,常见的扩展方式是,增加列,记录更多的业务计数。
如上图所示,由一列点赞计数,扩充为四列阅读、转发、评论、点赞计数。
增加列这种业务计数扩展方式的缺点是:每次要扩充业务计数时,总是需要修改表结构,增加列,很烦。
有没有不需要变更表结构的扩展方式呢?
行扩展是一种扩展性更好的方式。
表结构固化为:
- t_count(msg_id, count_key, count_value)
当要扩充业务计数时,增加一行就行,不需要修改表结构。
画外音:很多配置业务,会使用这种方案,方便增加配置。
增加行这种业务计数扩展方式的缺点是:表数据行数会增加,但这不是主要矛盾,数据库水平扩展能很轻松解决数据量大的问题。
接下来看下redis批量获取计数的优化方案。
原始方案,通过拼装key来区分同一个msg_id的不同业务计数。
可以升级为,同一个value来存储多个计数。
如上图所示,同一个msg_id的四个计数,存储在一个value里,从而避免多次redis访问。
画外音:通过value来扩展,是不是很巧妙?
总结
计数业务,在数据量大,并发量大的时候,要考虑的一些技术点:
计数系统优化先聊到这里,希望大家有收获。
【本文为专栏作者“58沈剑”原创稿件,转载请联系原作者】
戳这里,看该作者更多好文
文章标题:每秒30W次的点赞业务,怎么优化?
标题URL:http://www.shufengxianlan.com/qtweb/news49/85299.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联