redis——实战点赞

举报
兔老大 发表于 2021/04/20 00:16:31 2021/04/20
【摘要】 点赞功能随处可见,我们都知道点赞是一个非常高频的操作,redis就非常适合做这种工作。 实现效果: 分析:三种类型:给帖子点赞,给评论点赞,给回复点赞 我们只实现查看点赞数量的话,只要一个int记录一下就可以,但是我们之后还想查看点赞的人,所以要把每一个点赞的信息都记录好,方便后面的功能继续做出来。 思路: 点赞:把点赞的信息放进去。 取消:把点赞的信息删除。...

点赞功能随处可见,我们都知道点赞是一个非常高频的操作,redis就非常适合做这种工作。

实现效果:

分析:三种类型:给帖子点赞,给评论点赞,给回复点赞

我们只实现查看点赞数量的话,只要一个int记录一下就可以,但是我们之后还想查看点赞的人,所以要把每一个点赞的信息都记录好,方便后面的功能继续做出来。

思路:

点赞:把点赞的信息放进去。

取消:把点赞的信息删除。

在此之前,我们要封装一个get到key的类,方便后面复用。


  
  1. package com.now.community.community.util;
  2. public class RedisKeyUtil {
  3. private static final String SPLIT = ":";
  4. private static final String PREFIX_ENTITY_LIKE = "like:entity";
  5. private static final String PREFIX_USER_LIKE = "like:user";
  6. // 某个实体的赞
  7. // like:entity:entityType:entityId -> set(userId)
  8. public static String getEntityLikeKey(int entityType, int entityId) {
  9. return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
  10. }
  11. // 某个用户的赞
  12. // like:user:userId -> int
  13. public static String getUserLikeKey(int userId) {
  14. return PREFIX_USER_LIKE + SPLIT + userId;
  15. }
  16. }

点赞业务:


  
  1. // 点赞
  2. public void like(int userId, int entityType, int entityId, int entityUserId) {
  3. redisTemplate.execute(new SessionCallback() {
  4. @Override
  5. public Object execute(RedisOperations operations) throws DataAccessException {
  6. String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
  7. boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId);
  8. operations.multi();
  9. if (isMember) {
  10. operations.opsForSet().remove(entityLikeKey, userId);
  11. } else {
  12. operations.opsForSet().add(entityLikeKey, userId);
  13. }
  14. return operations.exec();
  15. }
  16. });
  17. }

我们要查找是否点赞,还有点赞数量,方便页面显示:


  
  1. // 查询某实体点赞的数量
  2. public long findEntityLikeCount(int entityType, int entityId) {
  3. String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
  4. return redisTemplate.opsForSet().size(entityLikeKey);
  5. }
  6. // 查询某人对某实体的点赞状态
  7. public int findEntityLikeStatus(int userId, int entityType, int entityId) {
  8. String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
  9. return redisTemplate.opsForSet().isMember(entityLikeKey, userId) ? 1 : 0;
  10. }

点赞LikeController


  
  1. @RequestMapping(path = "/like", method = RequestMethod.POST)
  2. @ResponseBody
  3. public String like(int entityType, int entityId,int entityUserId,int postId) {
  4. User user = hostHolder.getUser();
  5. // 点赞
  6. likeService.like(user.getId(), entityType, entityId,entityUserId);
  7. // 数量
  8. long likeCount = likeService.findEntityLikeCount(entityType, entityId);
  9. // 状态
  10. int likeStatus = likeService.findEntityLikeStatus(user.getId(), entityType, entityId);
  11. // 返回的结果
  12. Map<String, Object> map = new HashMap<>();
  13. map.put("likeCount", likeCount);
  14. map.put("likeStatus", likeStatus);
  15. return CommunityUtil.getJSONString(0, null, map);
  16. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/102788462

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。