婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > springboot +redis 實現點贊、瀏覽、收藏、評論等數量的增減操作

springboot +redis 實現點贊、瀏覽、收藏、評論等數量的增減操作

熱門標簽:廊坊外呼系統在哪買 地圖標注工廠入駐 一個地圖標注多少錢 b2b外呼系統 400電話辦理的口碑 南京手機外呼系統廠家 高碑店市地圖標注app 臺灣電銷 四川穩定外呼系統軟件

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
    BoundHashOperationsString, 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";
        ListMqMessage> 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();
        BoundHashOperationsString, 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實現點贊收藏評論內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 基于springboot微信公眾號開發(微信自動回復)
  • SpringBoot實現評論回復功能(數據庫設計)

標簽:定州 泰州 拉薩 伊春 河源 南寧 甘南 畢節

巨人網絡通訊聲明:本文標題《springboot +redis 實現點贊、瀏覽、收藏、評論等數量的增減操作》,本文關鍵詞  springboot,+redis,實現,點贊,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《springboot +redis 實現點贊、瀏覽、收藏、評論等數量的增減操作》相關的同類信息!
  • 本頁收集關于springboot +redis 實現點贊、瀏覽、收藏、評論等數量的增減操作的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 沙河市| 天等县| 周口市| 英吉沙县| 罗城| 兴安县| 谷城县| 博罗县| 平远县| 辽宁省| 益阳市| 东乡族自治县| 翁源县| 女性| 石景山区| 武安市| 呼伦贝尔市| 洛南县| 包头市| 芜湖县| 娱乐| 同德县| 淳化县| 阜新| 射阳县| 顺昌县| 平果县| 兴和县| 贵阳市| 郎溪县| 万全县| 延寿县| 河北区| 宁化县| 横峰县| 西吉县| 衡东县| 德江县| 宜兰市| 高尔夫| 通州市|