帖子详情涉及内容详情/阅读数/评论数/点赞数/评论列表显示、点赞/取消赞、判断是否点赞、评论、更新阅读数/评论数/点赞数等。
拿以上功能举例,业务一开始有帖子表、评论表、点赞表,所有操作未做任何处理均直连数据库,产生如下数据库操作:
- 获取帖子详情:通过tid查询帖子表拿到数据、对浏览数+1操作、通过uid和tid查询点赞表存在记录为已点赞。
- 新增评论:评论数据插入评论表、帖子表评论数+1操作。
- 点赞/取消点赞:点赞表插入数据、帖子表点赞数+1操作。
当数据量和访问量上去的时候,直连数据库查询就很慢了,解决方案是使用缓存和消息队列异步处理。
缓存
将接口获取的数据存到redis内存中消息队列异步处理业务
以redis list队列形式保存数据,取数据时按先进先出或者先进后出这样的形式有序进行。通常可以将需要做的操作加入到消息队列,另外一个服务专门处理消化这个队列,达到业务高峰期消峰和业务统一逐一处理的目的。
获取帖子详情
建立以tiezi:{tid}为key,hash数据结构保存字段和值的形式缓存。
原则先读缓存,缓存无数据再读数据库返回并写入缓存。
判断用户是否点赞
建立以userlikes:{tid}为key,sorted set数据结构保存用户的id(uid)和点赞时间,判断方式为当前uid存在此sort set集合中表示用户已点赞。使用sorted set结构是因为需要获取帖子的点赞列表
原则先读缓存,缓存无数据再读数据库同时更新缓存。
用户点赞/取消赞
更新缓存对应key进行增加/移除uid操作,将uid和tid插入点赞队列然后直接返回完成操作。另外一个后台任务会不断的从这个队列取出数据进行相应的数据库操作。
增加阅读数/点赞数
对缓存数据pvs进行+1操作,每天定时同步更新至数据库。
或者新增一个key=pvs的hash缓存,专门存放不同帖子今日的pv,然后每次获取帖子pv的时候,帖子详情中的pv加上今日pv即可。
新增评论/评论列表展示
思路是将评论数据先插入缓存,再加入消息队列异步插入到数据库中。
先插入缓存再插入数据库的方式,表的主键就不能使用数据库的自增了,主键需要改成通过程序生成, 然后将帖子的评论id保存起来,就像上面缓存帖子点赞一样的形式(sorted set),读取出来的评论id可以按插入时间有序排列。
评论列表展示时,例如拿最新的20条评论,先通过有序集合拿出这篇文章最新的前20个评论ID,再通过评论ID去拿评论内容展示出来。
网友评论