
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; // 其他字段...}
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月23日 03时08分23秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C语言编译错误列表
2019-03-07
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2019-03-07
python中列表 元组 字典 集合的区别
2019-03-07
Android DEX加固方案与原理
2019-03-07
iOS_Runtime3_动态添加方法
2019-03-07
Leetcode第557题---翻转字符串中的单词
2019-03-07
Problem G. The Stones Game【取石子博弈 & 思维】
2019-03-07
Java多线程
2019-03-07
openssl服务器证书操作
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
selenium+python之切换窗口
2019-03-07
重载和重写的区别:
2019-03-07
搭建Vue项目步骤
2019-03-07
账号转账演示事务
2019-03-07
SpringBoot找不到@EnableRety注解
2019-03-07
简易计算器案例
2019-03-07
在Vue中使用样式——使用内联样式
2019-03-07