MySQL 配置了Master-Slave后, 高并发下同步数据会需要一定时间,这个时间可能是1s, 2s, 所以添加的数据不能马上在slave 上查询的到. 在此背景下要把用户发的评论实时的列出来,改怎么实现?
我的思路:
评论添加到数据库之后,让文章ID为做key, 评论数据作为value 已经数据的形式序列化后保存在缓存中。缓存里面的是一个队列,队列大小可配置。
在列出评论之前,获取缓存里面评论数据,取出评论ID, 然后查询slave 数据库 加上条件 评论ID not in (?)
因为是分页查询,把查询结果merge后 减去多余的评论返回给客户端
这个是基本思路。
大家有更好的建议吗?
- memcached,mongodb等做一层缓存,楼上说的方法就不错
- 分表,分库
- 多slave
评论的前几页都从缓存里面取好了,后面的评论从数据库里面取
你的方法我感觉有以下问题:
- insert 成功后你要想马上取得评论主键 id,用
SELECT LAST_INSERT_ID()
查询的是从库,此时可能还没同步过来 - 按你的场景,有这种高并发的场景,数据量必然不小,
not in
无法走索引,会有性能问题
个人感觉有些简单的问题复杂化了。如果对评论的实时性要求比较高,我的建议是:
- 优化主从同步,同步延时无非要么是网络延迟,要么是从库更新单线程跟不上主库更新的多线程,可以用淘宝开发的 mysql 主从同步的开源解决方案 transfer
- 对业务进行垂直拆分,评论专门做成一个系统,独立的数据库,里面只放评论表
用户提交评论后,在前端,构造一个评论的结构,插入到html中去实时显示。一般等用户去刷新,都在1、2s甚至更多时间以后了。歪门邪道而已…………慎用~~
不要用自增int做评论id,自己生成GUID,之后一切都好办了。