小李飞刀资源网 Design By www.iooab.com
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(); }
总结
小李飞刀资源网 Design By www.iooab.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
小李飞刀资源网 Design By www.iooab.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年12月22日
2024年12月22日
- 小骆驼-《草原狼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]