基于redis加rabbitmq的简单点赞系统的设计与优化

背景

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

设计思想

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

  • 通用:点赞业务在设计的时候不要与业务系统耦合,必须同时支持不同业务的点赞功能

  • 独立:点赞功能是独立系统,并且不依赖其它服务,这样才具备可迁移性

  • 并发:一些热点业务点赞会很多,所以点赞功能必须支持高并发

  • 安全:要做好并发安全控制,避免重复点赞

     其次,设计合适的数据表,表中的字段包括点赞的业务id,用户id,业务类型,在业务表中加点赞数量的字段。

技术选型

mysql:保存点赞记录的信息;

rabbitmq:当用户点赞或者取消点赞之后,异步的投递点赞消息给具体的业务,目的是解耦合。

实现思路

    由于点赞有点击和取消两种状态,所以要做好幂等性校验,避免一个用户由于网路延迟等问题对同一个业务多次点赞。对于点赞,首先查询数据库中是否存在该条点赞记录,有的话直接终止,没有就新增点赞记录。对于取消,直接删除数据库中对应的记录。然后统计该业务的点赞数量投递到mq中

     然后在不同的服务中,监听mq,更新点赞次数。

     用户在浏览内容时,需要对自身点赞的内容进行高亮提示。该业务也是需要在点赞服务中实现,对于传入的一组业务集合,要查询当前用户点赞过的业务并返回,并暴露接口供其他服务调用。

性能优化

      以上就是一个点赞系统一个基础的实现方式,分析一下,进行一个点赞或取消操作时,需要访问多次数据库,如果用户访问量过大,会造成数据库访问量激增,对数据库的性能造成影响。

      常用的优化方案就是添加缓存并使用异步读写,我所采用的就是redis缓存和xxljob定期读取数据的方案,下面介绍一下实现思路。

      首先,在实现点赞的新增和取消时,采用了redis中的set集合,他是一个无序,内部元素不重复的集合,类似java中的HashSet。由于一个业务可以被多个用户点赞,所以将业务id设为key,将用户id设为value,可以轻松的实现对新插入的元素是否重复的校验并去重。添加点赞记录时,只需要判断返回值,1表示点赞成功,0表示已有记录,直接结束。取消点赞就是删除对应的value。对于点赞的次数,就是获取set集合的长度。

      在统计不同业务的点赞次数时,我使用的redis中的zset,他是有序的set集合,利用scoce对集合中的元素进行排序。利用这个数据结构,可以轻松的统计不同业务对应的点赞次数,并给出排序。

      最后,使用xxljob定期从缓存中获取业务的点赞数量,并投递给mq。xxljob他是一个优秀的定时任务框架,广泛的用于分布式系统的定时任务实现。在读取成功之后,要及时的将缓存中的key删除,减少内存的占用,保证消息的时效性。

      通过以上几点优化,有效的减少了对数据库的操作次数,降低了系统的压力,大大提高了系统的响应速度。

      以上就是我设计的一个简单的点赞系统的解决方案,当然,还存在大量的优化空间,欢迎各位讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值