本文共 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"
。
根据操作类型分支:
数据更新:通过 resetValue
方法对数据进行增减操作,根据 isPlus
参数判断是增加还是减少。
该方法用于对点赞数、收藏数等数量进行增减操作。该方法接收当前值、类型索引及是否为增加操作,返回更新后的值。
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();}
这是一个响应封装类,用于处理不同情况下返回的数据。类支持成功和失败两种状态,分别对应的业务逻辑。
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()); } // 其他静态方法定义...}
该 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; // 其他字段...}
转载地址:http://izugz.baihongyu.com/