springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作
发布日期:2021-05-24 15:48:52 浏览次数:11 分类:精选文章

本文共 5620 字,大约阅读时间需要 18 分钟。

Redis 在这篇文章中被用作一种轻量级的数据存储解决方案,用于替代传统的关系型数据库(如 MySQL),从而减轻数据库压力。通过 Redis ,我们可以快速实现对点赞、浏览、收藏、评论等操作的增减操作,同时利用 Redis 的持久化功能确保数据的存储安全。

常量 定义

系统中定义了一系列常量值,用于不同的操作类型表示不同功能:

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;

主要逻辑

这是实现点赞、浏览、收藏、评论等功能的核心逻辑。以下是具体操作流程:

  • 获取操作参数:从 ForumDTO 中获取帖子 ID、用户 ID 以及操作类型。

  • 生成唯一标识:将帖子 ID 转换为 Redis 中的键名。

  • 初始化数据:如果 Redis 中没有对应数据,则初始化为默认值 "0:0:0:0:0:0"

  • 根据操作类型分支

    • 浏览(OperationType = 1):增加浏览次数。
    • 帖子点赞(OperationType = 2)
      • 根据点击类型(0: 点赞,1: 取消点赞)执行相应操作。
    • 收藏(OperationType = 3)
      • 根据点击类型(0: 收藏, 1: 取消收藏)执行相应操作。
    • 评论点赞(OperationType = 4)
      • 需要评论 ID,对应的 Redis 数据库进行操作。
  • 数据更新:通过 resetValue 方法对数据进行增减操作,根据 isPlus 参数判断是增加还是减少。

  • resetValue 方法

    该方法用于对点赞数、收藏数等数量进行增减操作。该方法接收当前值、类型索引及是否为增加操作,返回更新后的值。

    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();}

    DataResponse 类

    这是一个响应封装类,用于处理不同情况下返回的数据。类支持成功和失败两种状态,分别对应的业务逻辑。

    package com.ehl.developerplatform.pojo;import com.ehl.developerplatform.euem.ResponseEnum;import lombok.Data;@Datapublic class DataResponse
    { private boolean success; private T data; private Integer code; private String message; public DataResponse(boolean success, T data, Integer code, String message) { this.success = success; this.data = data; this.code = code; this.message = message; } public static DataResponse success(ResponseEnum responseEnum) { return new DataResponse<>(true, null, responseEnum.getStatus(), responseEnum.getMessage()); } public static DataResponse fail(ResponseEnum responseEnum) { return new DataResponse<>(false, null, responseEnum.getStatus(), responseEnum.getMessage()); } // 其他静态方法定义...}

    ForumDTO 类

    该 DTO 类用于数据传输,定义了各个操作的参数,如帖子 ID、用户 ID、操作类型等。

    package com.ehl.developerplatform.pojo.dto;import com.ehl.developerplatform.anno.EnumValue;import lombok.Data;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import java.io.Serializable;@Datapublic class ForumDTO implements Serializable {    @Min(groups = { ForumDTO.SearchComment.class,SearchMyReply.class,searchMyLikePost.class,SearchMyCreatePost.class,SearchPostByBlogId.class,SearchCommentList.class,SearchPostList.class},value = 1, message = "每页数据最少一条")    @NotNull(groups = { ForumDTO.SearchComment.class,SearchMyReply.class,searchMyLikePost.class,SearchMyCreatePost.class,SearchPostByBlogId.class,SearchCommentList.class,SearchPostList.class},message = "[pageSize]字段不能为空")    private Integer pageSize;    @Min(groups = { ForumDTO.SearchComment.class,SearchMyReply.class,searchMyLikePost.class,SearchMyCreatePost.class,SearchCommentList.class,SearchPostByBlogId.class,SearchPostList.class},value = 1, message = "页码必须大于零")    @NotNull(groups = { ForumDTO.SearchComment.class,SearchMyReply.class,searchMyLikePost.class,SearchMyCreatePost.class,SearchCommentList.class,SearchPostByBlogId.class,SearchPostList.class},message = "[pageNum]字段不能为空")    private Integer pageNum;    @EnumValue(groups = { ForumDTO.SearchPostList.class}, byteValues = { 1, 2, 3, 4},message = "更新日期必须为指定值")    private Byte updateTime;    @NotEmpty(groups = { AddTopic.class},message = "帖子名称不能为空")    @Size(groups = { AddTopic.class},max = 30,min = 1,message = "帖子名称长度最长不能超过30个字符 最短不能小于1个字符")    private String name;    @NotNull(groups = { Comment.class,DeleteMyComment.class},message = "父id不能为空")    private Long pid;    @NotNull(groups = { SearchCommentList.class,UpdateInit.class,DeleteMyPost.class,KeepNum.class,Comment.class,SearchLatestNum.class,SearchPostById.class,SearchPostDetailById.class},message = "贴子id不能为空")    private Long postId;    @NotNull(groups = { AddTopic.class,Comment.class,SearchPostByBlogId.class},message = "所属专题id不能为空")    private Long blogId;    @NotNull(groups = { AddTopic.class},message = "帖子分类不能为空")    @EnumValue(groups = { SearchPostList.class,SearchPostByBlogId.class},byteValues = { 1,2,3,4,5,6},message = "帖子分类必须为指定值")    private Byte classFy;    @NotEmpty(groups = { AddTopic.class},message = "所属专题名不能为空")    private String title;    @NotEmpty(groups = { Comment.class,AddTopic.class},message = "评论内容不能为空")    private String content;    private String markText;    @NotEmpty(groups = { AddTopic.class,SearchMyReply.class,KeepNum.class,searchMyLikePost.class,SearchMyCreatePost.class,UpdatePostById.class,DeleteMyComment.class,Comment.class,DeleteMyPost.class,SearchLatestNum.class},message = "用户id不能为空")    private String userId;    @EnumValue(groups = { ForumDTO.KeepNum.class},byteValues = { 1, 2, 3, 4, 5, 6},message = "[operationType]字段必须为指定值")    @NotNull(groups = { ForumDTO.KeepNum.class},message = "[operationType]字段不能为空")    private Byte operationType;    @NotNull(groups = { DeleteMyComment.class},message = "评论id不能为空")    private Long commentId;    @EnumValue(groups = { ForumDTO.KeepNum.class},byteValues = { 0, 1}) private Byte clickType;        // 其他字段...}
    上一篇:java 生成6位数随机数
    下一篇:SQL语句学习笔记

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月23日 03时08分23秒