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

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

  • 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_{KaTeX parse error: Expected 'EOF', got '}' at position 8: post_id}̲{user_id}

批量处理点赞功能:

从Redis中,拿到reviewindex,然后迭代取出每一个书评信息,解析书评中的点赞和取消点赞操作,之后统一写入到数据库中

点赞列表:

这个数据必须要有,因为可以去重,另外就是作为社交产品,记录用户的一点一滴。

优点:数据一致性

redis作为storage使用时,一定要做好数据的持久化,必须开启 rdb 和 aof,这会导致业务只能使用一半的机器内存,所以要做好容量的监控,及时扩容。

三、数据库的设计

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

建表语句:
在这里插入图片描述

四、分享几个我接触过的含金量较高的项目

1、Twitter 后端系统 - Django 项目实战

设计Twitter本质上就是在考高并发的信息流系统,其涉及的技术难点非常多,项目的难度也更能检验面试者水平,而且从L3~L5都能问到。
在这里插入图片描述

  • 对于初级程序员(SDE1),可以把“设计Twitter”拆解出单独设计一个关注功能来问

  • 对于高级程序员(SDE2+),面试官通常会要求面试者实现设计登陆、发推、点赞、关注、取关等一系列功能

这些技术难点在《Twitter后端系统 - Django项目实战》首节试听课中都有详细介绍,目前还能免费试听,感兴趣的可以体验一下。

2、电商秒杀系统:双十一购物秒杀

这是一个典型的秒杀系统遇到高并发的情况。借此项目可以深度学习高并发、高性能架构设计和技术方法。

对应的秒杀业务流程如下:

1、数据库Mysql

2、持久层框架

3、基础框架:Springboot+Spring MVC

4、缓存中间件:Redis

5、消息中间件:RocketMQ

6、分布式唯一ID生成:雪花算法

7、流量控制框架:Sentinel

8、压力测试工具:Jmeter

如果遇到不会的技术点,最快的方式就是通过《电商秒杀系统 - Spring项目实战》学习。课程是由阿里巴巴技术部门架构师欧阳修讲解,覆盖Redis、缓存预热、防爬虫和黄牛恶意请求,乐观锁等技术。能在2周内快速完成秒杀项目。

课程还十分自信地开放了首节免费试听,会带大家了解秒杀系统实现的全流程、秒杀系统的重难点等,需要的朋友可以去体验看看~

3、AutoLoadCache

AutoLoadCache是基于AOP + Annotation等技术实现的高效的缓存管理解决方案,实现缓存与业务逻辑的分解,并增加了异步刷新和“拿来主义机制”,以适应高并发环境下的使用。

在这里插入图片描述

4、springboot-seckill

本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。
在这里插入图片描述

有两个优化方向

1.将请求尽量拦截在系统上游:可以通过限流、降级等措施来最大化减少对数据库的访问,从而保护系统。
2.充分利用缓存:秒杀商品是一个典型的读多写少的应用场景,充分利用缓存将大大提高并发量

5、系统架构设计 System Design 2022 版

如果希望在学会更多核心项目的同时,应对面试,追求去更大的公司工作的话,可以来体验下系统架构设计 System Design 2022 版

在应对面试官可能提出的问题时,常见的错误是面试官给出问题后,候选人就开始怼各种关键词,什么Load Balancer,Memcache,NodeJS,MongoDB,MySQL……

实际上,针对系统设计问题,九章算法有一套4S分析法,即使完全不知道的问题也可以按照这个方法一步步去回答。

所谓4S分析法中的4S是指Scenario(场景),Service(服务),Storage(存储),Scale(扩展)。
在这里插入图片描述

第一节的免费试听课程就会讲到设计Twitter和系统设计的通用解题法则,不妨去感受一下,简单入个门。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐