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();
}
总结
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作”评论...
更新日志
2025年10月24日
2025年10月24日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]
