明星的一条微博的点赞数可能有几十万,甚至百万以上。那么这个「点赞功能」(会记录谁点了赞),新浪微博的数据库是如何设计的呢?

刚在北大学长的《系统架构设计》讲座上听到这部分内容,觉得还蛮有意思的,这里简单交流一下。
扫码报名,免费试听

【点赞功能】的基本设计思路分两种:

  • mysql直接落地存储;
  • 利用点赞的业务特征来扔到redis中,然后离线刷回mysql
mysql方案

对于大多数中小型项目,低于千万级并发的数据,基本可以用mysql分表+cache完成。

这种方法只要做两个表就可以了:
1、记录文章被点赞的次数,有多少人点过赞
2、记录哪些文章被点赞过
常用的查询有
  • 查询用户点赞过的文章 select post_id from star where user_id=?
  • 查询文章的点赞用户 select user_id from star where post_id=?
  • 点赞数量可以通过定时异步统计更新到post和user 表中。
但他有个缺点:
就是当数据量大的时候,一张表在查询时压力巨大,分表可能会跟需求有冲突,解决办法是做两个表冗余,但也增加了存储空间和维护成本。
redis方案

redis主要特点就是快,而且支持更多数据类型,比如hash, set, zset...

使用 redis也分两种,一种是storage,一种是纯cache,需要+mysql一起。纯cache就是把数据从mysql先写入redis,用户先读cache,miss后再拉取MySQL,同时cache做同步。
redis存储结构👇
点赞数量场景:
通过user_id, post_id, 查询用户是否点过赞。
用户点赞/取消赞场景:
1、写入post_set
2、写入post_user_like_set_{$post_id}
3、写入post_user_like_{$post_id}{$user_id}
批量处理点赞功能
从Redis中,拿到reviewindex,然后迭代取出每一个书评信息,解析书评中的点赞和取消点赞操作,之后统一写入到数据库中。
点赞列表:
这个数据必须要有,因为可以去重,另外就是作为社交产品,记录用户的一点一滴
优点:数据一致性
redis作为storage使用时,一定要做好数据的持久化,必须开启 rdb 和 aof,这会导致业务只能使用一半的机器内存,所以要做好容量的监控,及时扩容。
数据库的设计

数据库表中至少要包含三个字段:
被点赞用户id,点赞用户id,点赞状态。再加上主键id,创建时间,修改时间就行了。

建表语句:
分享几个我接触过的含金量较高的项目
01
Twitter 后端系统 - Django 项目实战
设计Twitter本质上就是在考高并发的信息流系统,其涉及的技术难点非常多,项目的难度也更能检验面试者水平,而且从L3~L5都能问到。
  • 对于初级程序员(SDE1),可以把“设计Twitter”拆解出单独设计一个关注功能来问。
  • 对于高级程序员(SDE2+),面试官通常会要求面试者实现设计登陆、发推、点赞、关注、取关等一系列功能。
这些技术难点在《Twitter后端系统 - Django项目实战》首节试听课中都有详细介绍,目前还能免费试听,感兴趣的可以体验一下。
扫码报名,免费试听
02
电商秒杀系统:双十一购物秒杀
这是一个典型的秒杀系统遇到高并发的情况。借此项目可以深度学习高并发、高性能架构设计和技术方法。
对应的秒杀业务流程如下:
1、数据库Mysql2、持久层框架3、基础框架:Springboot+Spring MVC4、缓存中间件:Redis5、消息中间件:RocketMQ6、分布式唯一ID生成:雪花算法7、流量控制框架:Sentinel8、压力测试工具:Jmeter
如果遇到不会的技术点,最快的方式就是通过《电商秒杀系统 - Spring项目实战》学习。课程是由阿里巴巴技术部门架构师欧阳修讲解,覆盖Redis、缓存预热、防爬虫和黄牛恶意请求,乐观锁等技术。能在2周内快速完成秒杀项目。
课程还十分自信地开放了首节免费试听,会带大家了解秒杀系统实现的全流程、秒杀系统的重难点等,需要的朋友可以去体验看看~
扫码报名,免费试听
03
AutoLoadCache
AutoLoadCache是基于AOP + Annotation等技术实现的高效的缓存管理解决方案,实现缓存与业务逻辑的分解,并增加了异步刷新和“拿来主义机制”,以适应高并发环境下的使用。
04
springboot-seckill
本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。
有两个优化方向
1.将请求尽量拦截在系统上游:可以通过限流、降级等措施来最大化减少对数据库的访问,从而保护系统。
2.充分利用缓存:秒杀商品是一个典型的读多写少的应用场景,充分利用缓存将大大提高并发量。
05
系统架构设计 System Design 2021 版
如果希望在学会更多核心项目的同时,应对面试,追求去更大的公司工作的话,可以来体验下系统架构设计 System Design 2021 版
扫码报名,免费试听
在应对面试官可能提出的问题时,常见的错误是面试官给出问题后,候选人就开始怼各种关键词,什么Load Balancer,Memcache,NodeJS,MongoDB,MySQL……
实际上,针对系统设计问题,九章算法有一套4S分析法,即使完全不知道的问题也可以按照这个方法一步步去回答。
所谓4S分析法中的4S是指Scenario(场景),Service(服务),Storage(存储),Scale(扩展)。
第一节的免费试听课程就会讲到设计Twitter和系统设计的通用解题法则,不妨去感受一下,简单入个门。
扫码报名,免费试听
戳下方
阅读原文”免费试听课程
继续阅读
阅读原文