不到断气不罢休 发表于 2025-3-31 15:16:39

基于redis加rabbitmq的简单点赞系统的筹划与优化

配景

     点赞是当今互联网项目使用率非常高的一个业务场景,主要用于用户给内容点赞或者对其他人的评论点赞。通过统计点赞数目,可以筛选出热门内容,供用户高效的获取有价值的信息,提高系统的活跃度。所以,实现一个高效,安全,通用的点赞系统对系统的完整性有很大资助。
筹划头脑

      首先,点赞系统要为系统的差别部分所服务,为了降低系统的耦合度,要将其筹划成一个独立的服务,一个完整的点赞系统要具备以下四种特性:


[*] 通用:点赞业务在筹划的时候不要与业务系统耦合,必须同时支持差别业务的点赞功能
[*] 独立:点赞功能是独立系统,并且不依赖别的服务,如许才具备可迁移性
[*] 并发:一些热点业务点赞会很多,所以点赞功能必须支持高并发
[*] 安全:要做好并发安全控制,制止重复点赞
     其次,筹划合适的数据表,表中的字段包罗点赞的业务id,用户id,业务类型,在业务表中加点赞数目的字段。
技能选型

mysql:生存点赞记载的信息;
rabbitmq:当用户点赞或者取消点赞之后,异步的投递点赞消息给具体的业务,目的是解耦合。
实现思路

https://i-blog.csdnimg.cn/direct/836080b3123648b6926f899f67e2c126.png
    由于点赞有点击和取消两种状态,所以要做好幂等性校验,制止一个用户由于网路延长等标题对同一个业务多次点赞。对于点赞,首先查询数据库中是否存在该条点赞记载,有的话直接停止,没有就新增点赞记载。对于取消,直接删除数据库中对应的记载。然后统计该业务的点赞数目投递到mq中
     然后在差别的服务中,监听mq,更新点赞次数。
     用户在欣赏内容时,需要对自身点赞的内容进行高亮提示。该业务也是需要在点赞服务中实现,对于传入的一组业务聚集,要查询当前用户点赞过的业务并返回,并袒露接口供其他服务调用。
性能优化

https://i-blog.csdnimg.cn/direct/43a73f6dc0074ce38df8618466a50b49.png
      以上就是一个点赞系同一个基础的实现方式,分析一下,进行一个点赞或取消使用时,需要访问多次数据库,如果用户访问量过大,会造成数据库访问量激增,对数据库的性能造成影响。
      常用的优化方案就是添加缓存并使用异步读写,我所采用的就是redis缓存和xxljob定期读取数据的方案,下面先容一下实现思路。
      首先,在实现点赞的新增和取消时,采用了redis中的set聚集,他是一个无序,内部元素不重复的聚集,类似java中的HashSet。由于一个业务可以被多个用户点赞,所以将业务id设为key,将用户id设为value,可以轻松的实现对新插入的元素是否重复的校验并去重。添加点赞记载时,只需要判断返回值,1表示点赞成功,0表示已有记载,直接结束。取消点赞就是删除对应的value。对于点赞的次数,就是获取set聚集的长度。
      在统计差别业务的点赞次数时,我使用的redis中的zset,他是有序的set聚集,使用scoce对聚集中的元素进行排序。使用这个数据结构,可以轻松的统计差别业务对应的点赞次数,并给出排序。
      最后,使用xxljob定期从缓存中获取业务的点赞数目,并投递给mq。xxljob他是一个优秀的定时任务框架,广泛的用于分布式系统的定时任务实现。在读取成功之后,要及时的将缓存中的key删除,淘汰内存的占用,保证消息的时效性。
      通过以上几点优化,有效的淘汰了对数据库的使用次数,降低了系统的压力,大大提高了系统的响应速率。
      以上就是我筹划的一个简单的点赞系统的解决方案,当然,还存在大量的优化空间,欢迎各位讨论。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于redis加rabbitmq的简单点赞系统的筹划与优化