这个评论系统设计碉堡了

简介: 先赞后看,南哥助你Java进阶一大半官网给出了Facebook评论系统的高级设计图,Facebook的评论竟然是支持实时刷新的。也就是说用户不用刷新帖子,只要帖子有新的评论就会自动推送到用户端,这里Facebook使用的便是每天在全球有设备在使用的WebSocket技术。我是南哥,一个Java学习与进阶的领路人。相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。

先赞后看,南哥助你Java进阶一大半

geeksforgeeks.org官网给出了Facebook评论系统的高级设计图,Facebook的评论竟然是支持实时刷新的。也就是说用户不用刷新帖子,只要帖子有新的评论就会自动推送到用户端,这里Facebook使用的便是每天在全球有超过20亿设备在使用的WebSocket技术。

在这里插入图片描述

我是南哥,一个Java学习与进阶的领路人。

相信对你通关面试、拿下Offer进入心心念念的公司有所帮助。

⭐⭐⭐本文收录在《Java学习/进阶/面试指南》:https://github/JavaSouth

1. 评论系统设计

1.1 评论表如何设计

评论系统的表要这么设计,每条评论的id标识要么是根评论id、要么是回复评论id。如果是根评论,那parent_comment_id字段就为空;而回复别人的评论,parent_comment_id字段指向根评论id。

CREATE TABLE `comments` (
  `comment_id` INT AUTO_INCREMENT PRIMARY KEY,  -- 评论唯一ID
  `user_id` INT NOT NULL,                       -- 用户ID
  `content` TEXT NOT NULL,                      -- 评论内容
  `parent_comment_id` INT DEFAULT NULL,         -- 如果是回复,则指向原始评论ID
  `post_id` INT NOT NULL,                       -- 被评论的帖子或内容ID
  `like_count` INT DEFAULT 0,                   -- 点赞数量
  `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 评论创建时间
);

我们还要给评论加上点赞数,南哥给大家看看抖音的评论设计。

用户可以给每条评论打上点赞,所以我们应该再设计一个点赞表。其实抖音这种评论模式叫嵌套式评论结构,嵌套式评论注重用户对话交流,用户可以很方便地查看一个对话里的所有回复,我们看下抖音评论里有着展开10条回复的按钮。

在这里插入图片描述

其他评论模式设计还有平铺式评论结构,像微信朋友圈,或者Github的issue都是平铺式评论结构。这种设计更适合用户关注重点在发布的内容本身,而不是对话。大家有没发现微信朋友圈的特点是对话比较少点,点赞反而更多。

来看看点赞表设计。

CREATE TABLE `comment_likes` (
  `user_id` INT NOT NULL,                       -- 点赞用户ID
  `comment_id` INT NOT NULL,                    -- 被点赞的评论ID
  `liked_timeMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 点赞时间
);

1.2 评论数据存储

抖音每天产生视频几百万、上千万,每个视频的评论高的甚至有上万条评论,要怎么样的数据查询设计才能支持每天亿级的评论?

南哥先假设我们用MySQL作为实际的数据存储,这么高的并发肯定不能让查询直接冲击数据库 。再分库分表也是没用。

在这里插入图片描述

Elasticsearch官网这么宣传它的产品:

Elasticsearch 极其快速,快到不可思议

当用户发表评论时,我们首先把评论写入MySQL数据库,再使用异步机制把评论同步到Elasticsearch中。当在用户请求查询评论时,优先从 Elasticsearch 中进行查询。

// 评论存储到MySQL、Elasticsearch
public void storeComment(Comment comment) {
   
    // 将评论存入 MySQL
    commentRepository.save(comment);

    // 异步将评论同步到 Elasticsearch
    CompletableFuture.runAsync(() -> {
   
        elasticsearchService.indexComment(comment);
    });
}

1.3 事务控制

大家想一想以上设计,有哪些需要进行事务控制?

例如comment_likes点赞表的插入和comment评论表的更新,用户为某一个评论点赞,会在comment_likes表插入一条新记录,同时会更新comment表的点赞数量。

但是,从用户需求的角度来看,用户并不在意点赞数的强一致性和实时性,这点不使用事务也可以接受。

我曾经和老外程序员在论坛聊过,他说他们的点赞后端分布式服务用的本地缓存,即使每一个服务的本地缓存相对不太一致,对系统完全没有影响。

// 事务控制
@Transactional
public void likeComment(int commentId, int userId) {
   
    // 插入一条点赞记录
    commentLikesRepository.insert(userId, commentId);

    // 更新评论表中的点赞数量,假设有一个专门的方法来处理这个更新
    commentRepository.incrementLikeCount(commentId);
}

1.4 点赞数加入Redis

点赞数相比评论来说,量更加巨大,用户点赞时直接落到MySQL数据库肯定不合理,服务器扛不住也没必要扛。

假如点赞数没有进行事务控制。南哥打算这样处理,用户点赞后,后端服务接受到点赞请求,把用户内容、点赞数放到Redis里,这里采用Redis五大基本类型之一:Map。

// Map结构
comment_like_key = [comment_id_6:like_count = 66, comment_id_7:like_count = 77]

我们需要查询点赞数时直接从高性能内存数据库Redis查询。

当然这还没完,MySQL数据库和Elasticsearch的点赞量需要去同步更新,我们设置定时任务每个一段时间完成数据同步任务。上文的comment_likes点赞记录表同样需要记录,把点赞放到Redis时进行异步添加点赞记录即可。

// 定时任务数据同步任务
@Scheduled(fixedRate = 10000)
public void syncLikes() {
   
    // 从 Redis 中读取最新的点赞数据
    Map<Integer, Integer> likes = redisService.fetchAllLikes();

    // 同步到 MySQL 和 Elasticsearch
    likes.forEach((commentId, likeCount) -> {
   
        commentRepository.updateLikeCount(commentId, likeCount);
        elasticsearchService.updateLikeCount(commentId, likeCount);
    });
}

戳这,《JavaSouth》作为一份涵盖Java程序员所需掌握核心知识、面试重点的神秘文档。

我是南哥,南就南在Get到你的点赞点赞。

在这里插入图片描述

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
存储 设计模式 缓存
通用点赞设计思路
点赞作为一个高频率的操作,如果每次操作都读写数据库会增加数据库的压力,所以采用缓存+定时任务来实现。点赞数据是在redis中缓存半小时,同时定时任务是每隔5分钟执行一次,做持久化存储,这里的缓存时间和任务执行时间可根据项目情况而定。
3443 2
|
运维 网络协议 安全
长连接网关技术专题(十):百度基于Go的千万级统一长连接服务架构实践
本文将介绍百度基于golang实现的统一长连接服务,从统一长连接功能实现和性能优化等角度,描述了其在设计、开发和维护过程中面临的问题和挑战,并重点介绍了解决相关问题和挑战的方案和实践经验。
831 1
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
524 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
存储 监控 Linux
Linux: 检测磁盘坏块 你得会吧!
Linux: 检测磁盘坏块 你得会吧!
1371 19
Linux: 检测磁盘坏块 你得会吧!
|
运维 关系型数据库 MySQL
阿里 P7 到底是怎样的水平?
大家好,我是锋哥,今天分享我楼仔兄弟的一篇好文,希望对大家有帮助 ! 前几天二哥找我,问我阿里 P7 是怎样的水平,在面试中如何才能拿到阿里 P7 的职级。
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
1526 5
Redis中大Key与热Key的解决方案
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
传感器 人工智能 安全
智能窗户:自动调节光线与温度的玻璃
【10月更文挑战第20天】智能窗户通过内置传感器和控制系统,自动调节光线与温度,提升家居舒适度并实现节能减排。本文探讨其基本原理、技术创新、实际应用及未来发展趋势,展示这一高科技产品如何改变我们的生活方式。
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。

热门文章

最新文章