redis bitmaps实现点赞功能


作业:redis bitmaps实现点赞功能

需求描述

用户ID为数字的情况下用redis bitmaps实现点赞功能 (要求:不能保存数据)

实现功能

  1. 点赞
  2. 取消点赞
  3. 查看是否点赞
  4. 统计有多少点赞

设计思路

假设用户ID为123L,对contentId为001的文章点赞。

点赞:首先根据contentId生成赞数据存储的Redis key,比如生成策略为like_{contentId},userId为123L的用户点赞,点赞的value值设置为ture。

取消点赞:思路同上,value值设置为false。

是否点赞:根据key和偏移量的值来查询对应的值是true还是false。

统计有多少点赞:就是利用位图计数的原理来实现。

代码实现

1、在pox.xml中导入jedis依赖,如下:

<dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>

2、编写功能代码如下:

package jedis.test;
import redis.clients.jedis.Jedis;

/**
 * @Date: 2020-05-08
 * @Description: 用户ID为数字的情况下用redis bitmaps实现点赞功能
 **/
public class LikeOfRedisBitMap {

    private Jedis jedis = null;

    /**
     * 连接redis
     */
    public LikeOfRedisBitMap() {
        jedis = new Jedis("localhost", 6379);
    }

    /**
     * 点赞
     * @param contentId
     * @param userId
     */
    public void like(String contentId,Long userId){
        jedis.setbit("like_" + contentId, userId, true);
        System.out.println("ID为" + userId + "的用户给ID为"+ contentId + "的文章点赞");
    }

    /**
     * 取消点赞
     * @param contentId
     * @param userId
     */
    public void unLike(String contentId,Long userId){
        jedis.setbit("like_" + contentId, userId, false);
        System.out.println("ID为" + userId + "的用户取消了给ID为"+ contentId + "的文章点赞");
    }

    /**
     * 是否点赞
     * @param contentId
     * @param userId
     * @return
     */
    public boolean isLike(String contentId, Long userId){
        Boolean flag = jedis.getbit("like_" + contentId, userId);
        if (flag) {
            System.out.println("ID为" + userId + "的用户给ID为"+ contentId + "的文章点赞");
        }
        System.out.println("ID为" + userId + "的用户没有给ID为"+ contentId + "的文章点赞");
        return flag;
    }

    /**
     * 统计有多少点赞
     * @param contentId
     * @return
     */
    public Long likeCount(String contentId){
        Long count = jedis.bitcount("like_" + contentId);
        System.out.println("ID为" + contentId + "的文章点赞数为" + count);
        return count;
    }

    public static void main(String[] args) {
        LikeOfRedisBitMap likeDemo = new LikeOfRedisBitMap();
        // 点赞
        likeDemo.like("001",123L);
        // 取消点赞
        likeDemo.unLike("001",123L);
        // 是否点赞
        likeDemo.isLike("001",123L);

        likeDemo.like("001", 234L);
        likeDemo.like("001", 235L);
        likeDemo.like("001", 236L);
        // 统计有多少点赞
        likeDemo.likeCount("002");
    }
}

评论
评论
  目录