springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作

 更新时间:2020年09月18日 11:19:26   作者:工藤(kodou)  
这篇文章主要介绍了springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作

前言

第一次写博客,记录一下:

在这里插入图片描述

最近做了一个帖子的收藏、点赞数量的功能,其实之前也做过类似的功能,因为之前一直使用的mysql 总是感觉对于这种频繁需要改变的值,不应该给予Mysql过大的压力,本文章采用的是redis 做了持久化。下面贴出关键代码:DataResponse是项目中使用的结果封装实体类;forumDTO是此功能的参数实体,如果有需要请留言。

常量如下:

 private static final String DEFAULT_VALUE = "0:0:0:0:0:0";
  public static final Byte BYTE_ZERO = 0;
  public static final Byte BYTE_ONE = 1;
  public static final Byte BYTE_TWO = 2;
  public static final Byte BYTE_THREE = 3;
  public static final Byte BYTE_FOUR = 4;
  public static final Byte BYTE_FIVE = 5;
  public static final Byte BYTE_SIX = 6;
 @Override
  public DataResponse keepNum(ForumDTO forumDTO) {
    //将帖子id 设置为 key
    String key = forumDTO.getPostId().toString();
    //get 用户id
    String userId = forumDTO.getUserId();
    String count, newCount;
    //绑定数据集key
    BoundHashOperations<String, Object, Object> post = redisTemplate.boundHashOps("post:");
    //获取hKey
    // count: 0论坛-点赞量 1评论量 2收藏量 3浏览 4评论-点赞量
    if (null == post.get(key)) {
      //无则set
      post.put(key, DEFAULT_VALUE);
      //再取出来赋值给 count
      count = post.get(key).toString();
    } else {
      //有直接赋值 count
      count = post.get(key).toString();
    }
    // operationType 1 浏览 2 帖子点赞 3 收藏 4评论-点赞
    String prefix;
    switch (forumDTO.getOperationType()) {
      case 1:
        //记录浏览次数 OPERATIONTYPE 1 : 记录浏览次数
        newCount = resetValue(count, BYTE_THREE, true);
        post.put(key, newCount);
        break;
      case 2:
        //记录帖子-点赞
        prefix = "thumbs:post";
        switch (forumDTO.getClickType()) {
          case 0:
            /**
             * OPERATIONTYPE 2: + CLICKTYPE 0 = 给帖子点赞
             * 0点赞
             * 从redis中获取数量 帖子d 例如:177488r88t78r78r7
             * count: 0论坛-点赞量 1评论量 2收藏量 3浏览 4评论-点赞量
             * 避免每种数量都去查询redis 直接通过 redis value 记录所有的数量
             * 获取加 +1 后的值
             */
            if (redisTemplate.opsForSet().isMember(prefix + ":" + key, prefix + ":" + userId)) {
              return DataResponse.fail("不能重复点赞哦");
            } else {
              redisTemplate.opsForSet().add(prefix + ":" + key, prefix + ":" + userId);
            }
            newCount = resetValue(count, BYTE_ZERO, true);
            //set to redis
            post.put(key, newCount);
            break;
          case 1:
            //OPERATIONTYPE 2: + CLICKTYPE 1 = 取消帖子点赞
            //1取消帖子点赞
            if (!redisTemplate.opsForSet().isMember(prefix + ":" + key, prefix + ":" + userId)) {
              //重复处理
              return DataResponse.fail("不能重复取消哦");
            } else {
              //删除
              redisTemplate.opsForSet().remove(prefix + ":" + key, prefix + ":" + userId);
            }
            newCount = resetValue(count, BYTE_ZERO, false);
            post.put(key, newCount);
            break;
        }
        break;
      case 3:
        prefix = "collection:post";
        List<MqMessage> sendList = new LinkedList<>();
        MqMessage mqMessage = new MqMessage();
        switch (forumDTO.getClickType()) {
          //OPERATIONTYPE 3 + CLICKTYPE 0 = 记录收藏
          case 0:
            //数量+1
            //根据用户id + 帖子id 查询redis 数据
            if (redisTemplate.opsForSet().isMember(prefix + ":" + key, prefix + ":" + userId)) {
              //重复处理
              return DataResponse.fail("不能重复收藏哦");
            }
            //add
            redisTemplate.opsForSet().add(prefix + ":" + key, prefix + ":" + userId);
            //set to redis
            newCount = resetValue(count, BYTE_TWO, true);
            post.put(key, newCount);
            mqMessage.setType(new Byte("9"));
            mqMessage.setSenderId(userId);
            mqMessage.setPostId(forumDTO.getPostId());
            sendList.add(mqMessage);
            this.sendMq.send(sendList);
            break;
          //OPERATIONTYPE 3 + CLICKTYPE 1 = 取消收藏
          case 1:
            //取消收藏
            //尝试从redis取出当前用户是否已经收藏
            if (!redisTemplate.opsForSet().isMember(prefix + ":" + key, prefix + ":" + userId)) {
              //重复处理
              return DataResponse.fail("不能重复取消哦");
            }
            //删除
            redisTemplate.opsForSet().remove(prefix + ":" + key, prefix + ":" + userId);
            newCount = resetValue(count, BYTE_TWO, false);
            post.put(key, newCount);
            mqMessage.setType(new Byte("10"));
            mqMessage.setSenderId(userId);
            mqMessage.setPostId(forumDTO.getPostId());
            sendList.add(mqMessage);
            this.sendMq.send(sendList);
            break;
        }
        break;
      case 4:
        //记录评论-点赞
        // OPERATIONTYPE 4: + CLICKTYPE 0 = 给评论点赞
        if (null == forumDTO.getCommentId()) {
          return DataResponse.fail("评论id不能为空");
        }
        String commentNum, ckey = forumDTO.getCommentId().toString();
        BoundHashOperations<String, Object, Object> comment = redisTemplate.boundHashOps("post:comment");
        if (null == comment.get(ckey)) {
          //无则set
          comment.put(ckey, "0");
          //再取出来赋值给 count
          commentNum = comment.get(ckey).toString();
        } else {
          //有直接赋值 count
          commentNum = comment.get(ckey).toString();
        }
        //赞评论
        prefix = "thumbs:comment";
        switch (forumDTO.getClickType()) {
          case 0:
            /**
             * 0点赞
             * 从redis中获取数量 帖子d 例如:177488r88t78r78r7
             * count: 0论坛-点赞量 1评论量 2收藏量 3浏览 4评论-点赞量
             * 避免每种数量都去查询redis 直接通过 redis value 记录所有的数量
             * 获取加 + 后的值
             */
            if (redisTemplate.opsForSet().isMember(prefix + ":" + ckey, prefix + ":" + userId)) {
              return DataResponse.fail("不能重复点赞哦");
            } else {
              redisTemplate.opsForSet().add(prefix + ":" + ckey, prefix + ":" + userId);
            }
            //set to redis
            comment.put(ckey, cResetValue(commentNum, true));
            break;
          case 1:
            //1取消评论点赞
            if (!redisTemplate.opsForSet().isMember(prefix + ":" + ckey, prefix + ":" + userId)) {
              //重复处理
              return DataResponse.fail("不能重复取消哦");
            } else {
              //删除
              redisTemplate.opsForSet().remove(prefix + ":" + ckey, prefix + ":" + userId);
            }
            newCount = cResetValue(commentNum, false);
            comment.put(ckey, newCount);
            break;
        }
        break;
      default:
        DataResponse.fail(ResponseEnum.FAILED);
    }
    return DataResponse.success(ResponseEnum.SUCCESS);
  }

 

resetValue代码:

 /**
   * 功能描述: <br>
   * 〈点赞数、收藏数等数量重置〉
   * @param val  数组
   * @param type  0帖子点赞量 1评论量 2收藏量 3浏览 4评论点赞量
   * @param isPlus 是否增加数量 true +  false -
   * @Return: java.lang.String
   * @Author:王震
   * @Date: 2020/8/5 10:27
   * StringUtils包:import org.apache.commons.lang3.StringUtils;
   * 可以使用jdk的包替代split方法;但jdk的包需要验证正则,效率较低。
   */
  private String resetValue(String val, int j, boolean isPlus) {
    String[] value = StringUtils.split(val, ":");
    Long temp = Long.valueOf(value[j]);
    StringBuffer sb = new StringBuffer(16);
    if (isPlus) {
      temp += 1;
    } else {
      temp -= 1;
    }
    value[j] = temp.toString();
    for (int i = 0, len = value.length; i < len; i++) {
      if (i != len - 1) {
        sb.append(value[i]).append(":");
      }else {
        sb.append(value[i]);
      }
    }
    return sb.toString();
  }

总结

到此这篇关于springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作的文章就介绍到这了,更多相关springboot +redis实现点赞收藏评论内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • 浅谈Redis阻塞的9种情况

    浅谈Redis阻塞的9种情况

    本文主要介绍了浅谈Redis阻塞的9种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • SpringBoot集成Redis的思路详解

    SpringBoot集成Redis的思路详解

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。接下来通过本文给大家分享SpringBoot集成Redis的详细过程,感兴趣的朋友一起看看吧
    2021-10-10
  • redis中事务机制及乐观锁的实现

    redis中事务机制及乐观锁的实现

    这篇文章主要介绍了redis中事务机制及乐观锁的相关内容,通过事务的执行分析Redis乐观锁,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Windows中redis设置密码的两种方法

    Windows中redis设置密码的两种方法

    之前写的一个项目,有项目代码,有数据库,但是本地没redis,没法跑此项目,故思考在本地安装一个redis做登录session存储,所以开始动手实践,下面这篇文章主要给大家介绍了关于Windows中redis设置密码的两种方法,需要的朋友可以参考下
    2023-04-04
  • redis中key使用冒号分隔的原理小结

    redis中key使用冒号分隔的原理小结

    Redis是一种高性能的键值对非关系型数据库,通过redis不同类型命令可以为其中的键指定不同的数据类型,其中每个键的命名规范通常使用冒号符号分隔字符串,本文主要介绍了redis中key使用冒号分隔的原理小结,感兴趣的可以了解一下
    2024-01-01
  • Redis不仅仅是缓存,还是……

    Redis不仅仅是缓存,还是……

    Redis是一个开源的(BSD协议),内存中的数据结构存储,它可以用作数据库,缓存,消息代理。这篇文章主要介绍了Redis不仅仅是缓存,还是……,需要的朋友可以参考下
    2020-12-12
  • redis redistemplate序列化对象配置方式

    redis redistemplate序列化对象配置方式

    这篇文章主要介绍了redis redistemplate序列化对象配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 基于Redis实现阻塞队列的方式

    基于Redis实现阻塞队列的方式

    本文主要讲解基于?Redis?的方式实现异步队列,基于?Redis?的?list?实现队列的方式也有多种,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 详解Redis Stream做消息队列

    详解Redis Stream做消息队列

    这篇文章主要介绍了详解Redis Stream做消息队列,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Redis五大基本数据类型及对应使用场景总结

    Redis五大基本数据类型及对应使用场景总结

    Redis有五种基本数据类型,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted?Set),这些基本数据类型使得Redis具备了丰富的数据结构和功能,适用于各种不同的应用场景,本文就给大家详细的介绍一下这五大类型
    2023-08-08

最新评论

?


http://www.vxiaotou.com