MySQL数据库高并发下文章的评论实现-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

MySQL数据库高并发下文章的评论实现

蛮大人123 2016-02-11 17:05:58 1844

MySQL 配置了Master-Slave后, 高并发下同步数据会需要一定时间,这个时间可能是1s, 2s, 所以添加的数据不能马上在slave 上查询的到. 在此背景下要把用户发的评论实时的列出来,改怎么实现?
我的思路:
评论添加到数据库之后,让文章ID为做key, 评论数据作为value 已经数据的形式序列化后保存在缓存中。缓存里面的是一个队列,队列大小可配置。
在列出评论之前,获取缓存里面评论数据,取出评论ID, 然后查询slave 数据库 加上条件 评论ID not in (?)
因为是分页查询,把查询结果merge后 减去多余的评论返回给客户端
这个是基本思路。

缓存 关系型数据库 MySQL 数据库
分享到
取消 提交回答
全部回答(2)
  • 慕之
    2019-07-17 18:40:54

    首先主从延迟1-2s,这个可优化的, 也有成熟的方案, 延迟实际应该是毫秒级别的。
    其次我有一个疑问, 不知道你们文章的评论量有多少? 如果高并发情况下, 评论量势必会很大, 是否进行了分库分表操作, 目前我的理解你们评论表应该有要对文章id和用户名分别建索引, 这种情形下进行分库分表就比较麻烦了。 当然这个疑问和楼主说的问题就不相关了。 针对评论这种场景, 可以考虑使用mysql + ElasticSearch 的方式存放, mysql表只对点评ID建唯一索引, 所有的查询都走ES(ES存放什么根据业务需要, 比如楼主这种业务, 可以存放文章Id, 用户名, 点评ID), 反查出点评ID然后从mysql中查询对应的点评内容。 使用这种架构mysql可按照点评ID分库分表, ElasticSearch自身支持水平扩容。

    0 0
  • 蛮大人123
    2019-07-17 18:40:54

    你的方法我感觉有以下问题:
    insert 成功后你要想马上取得评论主键 id,用 SELECT LAST_INSERT_ID() 查询的是从库,此时可能还没同步过来
    按你的场景,有这种高并发的场景,数据量必然不小, not in 无法走索引,会有性能问题
    个人感觉有些简单的问题复杂化了。如果对评论的实时性要求比较高,我的建议是:
    优化主从同步,同步延时无非要么是网络延迟,要么是从库更新单线程跟不上主库更新的多线程,可以用淘宝开发的 mysql 主从同步的开源解决方案 transfer
    对业务进行垂直拆分,评论专门做成一个系统,独立的数据库,里面只放评论表

    0 0
添加回答
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题
推荐课程