redis——实战点赞
【摘要】 点赞功能随处可见,我们都知道点赞是一个非常高频的操作,redis就非常适合做这种工作。
实现效果:
分析:三种类型:给帖子点赞,给评论点赞,给回复点赞
我们只实现查看点赞数量的话,只要一个int记录一下就可以,但是我们之后还想查看点赞的人,所以要把每一个点赞的信息都记录好,方便后面的功能继续做出来。
思路:
点赞:把点赞的信息放进去。
取消:把点赞的信息删除。...
点赞功能随处可见,我们都知道点赞是一个非常高频的操作,redis就非常适合做这种工作。
实现效果:
分析:三种类型:给帖子点赞,给评论点赞,给回复点赞
我们只实现查看点赞数量的话,只要一个int记录一下就可以,但是我们之后还想查看点赞的人,所以要把每一个点赞的信息都记录好,方便后面的功能继续做出来。
思路:
点赞:把点赞的信息放进去。
取消:把点赞的信息删除。
在此之前,我们要封装一个get到key的类,方便后面复用。
-
package com.now.community.community.util;
-
-
public class RedisKeyUtil {
-
-
private static final String SPLIT = ":";
-
private static final String PREFIX_ENTITY_LIKE = "like:entity";
-
private static final String PREFIX_USER_LIKE = "like:user";
-
-
// 某个实体的赞
-
// like:entity:entityType:entityId -> set(userId)
-
public static String getEntityLikeKey(int entityType, int entityId) {
-
return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
-
}
-
-
// 某个用户的赞
-
// like:user:userId -> int
-
public static String getUserLikeKey(int userId) {
-
return PREFIX_USER_LIKE + SPLIT + userId;
-
}
-
}
点赞业务:
-
// 点赞
-
public void like(int userId, int entityType, int entityId, int entityUserId) {
-
redisTemplate.execute(new SessionCallback() {
-
@Override
-
public Object execute(RedisOperations operations) throws DataAccessException {
-
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
-
boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId);
-
operations.multi();
-
if (isMember) {
-
operations.opsForSet().remove(entityLikeKey, userId);
-
} else {
-
operations.opsForSet().add(entityLikeKey, userId);
-
}
-
return operations.exec();
-
}
-
});
-
}
我们要查找是否点赞,还有点赞数量,方便页面显示:
-
// 查询某实体点赞的数量
-
public long findEntityLikeCount(int entityType, int entityId) {
-
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
-
return redisTemplate.opsForSet().size(entityLikeKey);
-
}
-
-
// 查询某人对某实体的点赞状态
-
public int findEntityLikeStatus(int userId, int entityType, int entityId) {
-
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
-
return redisTemplate.opsForSet().isMember(entityLikeKey, userId) ? 1 : 0;
-
}
点赞LikeController
-
@RequestMapping(path = "/like", method = RequestMethod.POST)
-
@ResponseBody
-
public String like(int entityType, int entityId,int entityUserId,int postId) {
-
User user = hostHolder.getUser();
-
-
// 点赞
-
likeService.like(user.getId(), entityType, entityId,entityUserId);
-
-
// 数量
-
long likeCount = likeService.findEntityLikeCount(entityType, entityId);
-
// 状态
-
int likeStatus = likeService.findEntityLikeStatus(user.getId(), entityType, entityId);
-
// 返回的结果
-
Map<String, Object> map = new HashMap<>();
-
map.put("likeCount", likeCount);
-
map.put("likeStatus", likeStatus);
-
return CommunityUtil.getJSONString(0, null, map);
-
}
文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。
原文链接:fantianzuo.blog.csdn.net/article/details/102788462
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)