redis实现点赞排行榜

思考方式:

        最近一个活动项目本来要实现点赞排行榜的嘛,我是使用nodejs进行服务开发的。在我研究一番之后,最后还不归我这里做。但是研究了,那就研究到底。它是怎么做的呢?

        首先点赞,我们需要考虑到它的频繁操作性。尽量减少数据库的频繁读写,当我接到着问题的时候,我会想这不就是用redis实现嘛!但是实际上呢,因为之前了解redis数据结构,也只是做了简单的string和list类型存取实践,当真的实现现在这需求时,貌似不熟悉别的结构实际使用。那么查看了下redis文档,发现hash结构适合本次的实践。那么hash的结构是什么呢?仔细研究会发现它是一个 key map结构的,map包括key,vlaue。

我现在的目标就是储存当前活动的中发布的作品对应它的点赞数。那么很好看到map就够的key可以为作品标识,value为点赞次数

hset myhash 作品Id 点赞数    // 将作品对应的点赞数存进redis

每次有人对作品点赞了,点赞方法先得到当前的点赞数,在此基础上+1。

         其实做到这一块我就想到了,取消点赞肯定也需要,那么很简单,写一个取消点赞的方法,查出当前点赞的数量,在此基础上-1。

当然这样的方案正常情况下完全没问题。基于后端思维,会多想一下:

两个用户同时对一个作品点赞的时候,首先同时获取到点赞数,并同时修改点赞值value,那么会不会存在点赞数量不对的并发问题呢?(基于数据库并发原理想的)

        其实从社交产品来说,这种点赞数丢失是允许的。那么如果是可以修改的政府投票系统,是会存在这种问题的。

        第一种想法就是加锁,从而解决这个并发问题


那么实现排行榜不仅需要按照点赞数排序,还要获取用户点赞的内容,并且一般要么展示所有,要么分页展示

hgetall myhash    // 获取全部map中的数据
// 显然当前hash满足不了排序,那么只有zset有序无重复数据
zadd key score member     // score为权重, 默认从小到达
zrevranage key start stop        //分页获取

你可能感兴趣的:(redis,node.js,redis)