首页 > 高并发下文章的评论实现

高并发下文章的评论实现

MySQL 配置了Master-Slave后, 高并发下同步数据会需要一定时间,这个时间可能是1s, 2s, 所以添加的数据不能马上在slave 上查询的到. 在此背景下要把用户发的评论实时的列出来,改怎么实现?

我的思路:

  1. 评论添加到数据库之后,让文章ID为做key, 评论数据作为value 已经数据的形式序列化后保存在缓存中。缓存里面的是一个队列,队列大小可配置。

  2. 在列出评论之前,获取缓存里面评论数据,取出评论ID, 然后查询slave 数据库 加上条件 评论ID not in (?)

  3. 因为是分页查询,把查询结果merge后 减去多余的评论返回给客户端

这个是基本思路。

大家有更好的建议吗?


  1. memcached,mongodb等做一层缓存,楼上说的方法就不错
  2. 分表,分库
  3. 多slave

评论的前几页都从缓存里面取好了,后面的评论从数据库里面取


你的方法我感觉有以下问题:

  1. insert 成功后你要想马上取得评论主键 id,用 SELECT LAST_INSERT_ID() 查询的是从库,此时可能还没同步过来
  2. 按你的场景,有这种高并发的场景,数据量必然不小, not in 无法走索引,会有性能问题

个人感觉有些简单的问题复杂化了。如果对评论的实时性要求比较高,我的建议是:

  1. 优化主从同步,同步延时无非要么是网络延迟,要么是从库更新单线程跟不上主库更新的多线程,可以用淘宝开发的 mysql 主从同步的开源解决方案 transfer
  2. 对业务进行垂直拆分,评论专门做成一个系统,独立的数据库,里面只放评论表

用户提交评论后,在前端,构造一个评论的结构,插入到html中去实时显示。一般等用户去刷新,都在1、2s甚至更多时间以后了。歪门邪道而已…………慎用~~


不要用自增int做评论id,自己生成GUID,之后一切都好办了。

【热门文章】
【热门文章】