作业:redis bitmaps实现点赞功能
需求描述
用户ID为数字的情况下用redis bitmaps实现点赞功能 (要求:不能保存数据)
实现功能
- 点赞
- 取消点赞
- 查看是否点赞
- 统计有多少点赞
设计思路
假设用户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");
}
}