重学SpringBoot3-集成Redis(十二)之点赞功能实现

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-集成Redis(十二)之点赞功能实现

  • 1. 点赞功能的场景分析
  • 2. 项目环境配置
    • 2.1. 依赖引入
    • 2.2. Redis 配置
  • 3. 点赞功能的实现
    • 3.1. 点赞服务层
    • 3.2. 点赞控制器
    • 3.3. 演示
      • 点赞操作
      • 获取点赞数
      • 检查用户是否点赞
      • 取消点赞
  • 4. 点赞功能的详细解释
    • 4.1. 用户点赞和取消点赞
    • 4.2. 统计点赞数
    • 4.3. 判断用户是否点赞
  • 5. Redis Set 数据结构的优势
  • 6. 总结

在现代的应用中,点赞功能是一个非常常见的需求,尤其在社交媒体、博客等平台上。Redis 作为一个高性能的键值存储系统,由于其读写速度快支持丰富的数据结构,因此非常适合用来实现实时的点赞功能。本文将介绍如何结合 Spring Boot 3Redis 来实现一个高效的点赞功能。


1. 点赞功能的场景分析

点赞功能通常涉及以下场景:

  • 用户点赞或取消点赞:某个用户对某篇文章或某条评论进行点赞或取消操作。
  • 统计点赞数量:实时显示某个对象(如文章、视频、评论)的总点赞数。
  • 用户点赞状态查询:判断某个用户是否对某个对象点赞过。

Redis 通过Set 数据结构可以很好地解决这些问题。Redis 的 Set 不允许重复元素,且支持快速添加、删除、判断成员是否存在等操作。

点赞场景


2. 项目环境配置

2.1. 依赖引入

首先,在 pom.xml 中引入 Spring Boot 3Redis 的相关依赖,具体参考重学SpringBoot3-集成Redis(一)之基本使用:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2. Redis 配置

application.yml 中配置 Redis 连接:

spring:data:redis:host: localhostport: 6379            # Redis 端口password: redis123456 # 如果有密码可以在这里配置lettuce:pool:max-active: 100    # 最大并发连接数max-idle: 50       # 最大空闲连接数min-idle: 10       # 最小空闲连接数

3. 点赞功能的实现

在实现点赞功能时,通常会用 Redis 的 Set 数据结构来存储每个对象(如文章、视频)的点赞用户列表。每次点赞操作就是往这个 Set 中添加用户 ID,取消点赞则是从 Set 中移除用户 ID。

3.1. 点赞服务层

package com.coderjia.boot310redis.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;/*** @author CoderJia* @create 2024/10/10 下午 09:45* @Description**/
@Service
public class LikeService {@Autowiredprivate StringRedisTemplate redisTemplate;// Redis Key 前缀private static final String LIKE_KEY_PREFIX = "like:";  // 用户点赞public void likePost(String postId, String userId) {String redisKey = LIKE_KEY_PREFIX + postId;redisTemplate.opsForSet().add(redisKey, userId);}// 用户取消点赞public void unlikePost(String postId, String userId) {String redisKey = LIKE_KEY_PREFIX + postId;redisTemplate.opsForSet().remove(redisKey, userId);}// 查询某个帖子点赞数public Long getLikeCount(String postId) {String redisKey = LIKE_KEY_PREFIX + postId;return redisTemplate.opsForSet().size(redisKey);}// 判断用户是否点赞public boolean hasLiked(String postId, String userId) {String redisKey = LIKE_KEY_PREFIX + postId;return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(redisKey, userId));}
}

3.2. 点赞控制器

package com.coderjia.boot310redis.demos.web;import com.coderjia.boot310redis.service.LikeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @author CoderJia* @create 2024/10/10 下午 09:46* @Description**/
@RestController
@RequestMapping("/like")
public class LikeController {@Autowiredprivate LikeService likeService;// 点赞操作@PostMapping("/like")public String like(@RequestParam String postId, @RequestParam String userId) {likeService.likePost(postId, userId);return "Liked post: " + postId + " by user: " + userId;}// 取消点赞@PostMapping("/unlike")public String unlike(@RequestParam String postId, @RequestParam String userId) {likeService.unlikePost(postId, userId);return "Unliked post: " + postId + " by user: " + userId;}// 获取点赞数@GetMapping("/count")public Long getLikeCount(@RequestParam String postId) {return likeService.getLikeCount(postId);}// 检查用户是否点赞@GetMapping("/status")public boolean hasLiked(@RequestParam String postId, @RequestParam String userId) {return likeService.hasLiked(postId, userId);}
}

3.3. 演示

点赞操作

curl -X POST http://localhost:8080/like/like?postId=p101&userId=1

点赞

获取点赞数

curl http://localhost:8080/like/count?postId=p101

获取点赞数

检查用户是否点赞

curl http://localhost:8080/like/status?postId=p101&userId=1

检查用户是否点赞

取消点赞

curl -X POST http://localhost:8080/like/unlike?postId=p101&userId=1

取消点赞

4. 点赞功能的详细解释

4.1. 用户点赞和取消点赞

每当用户点赞时,我们将用户 ID 存入 Redis 的 Set 中。由于 Redis 的 Set 不允许重复元素,用户多次点赞同一篇文章也只会被记录一次。

redisTemplate.opsForSet().add(redisKey, userId);

取消点赞则是将用户 ID 从 Set 中移除:

redisTemplate.opsForSet().remove(redisKey, userId);

4.2. 统计点赞数

统计点赞数非常简单,直接调用 Redis 的 size() 方法即可:

redisTemplate.opsForSet().size(redisKey);

这比使用传统数据库查询要快得多,尤其在大量用户点赞的情况下,Redis 能保持高性能。

4.3. 判断用户是否点赞

可以通过 Redis 的 isMember() 方法来判断某个用户是否已经对某篇文章点赞:

redisTemplate.opsForSet().isMember(redisKey, userId);

这一点对前端显示用户是否已点赞的状态非常重要,用户体验更好。


5. Redis Set 数据结构的优势

Redis 的 Set 数据结构非常适合用来存储点赞功能的用户列表,原因有以下几点:

  1. 唯一性:Redis Set 不允许重复元素,确保用户对同一篇文章只能点赞一次。
  2. 高性能:Redis 是内存级存储,读写速度极快,适合大规模的点赞操作。
  3. 丰富的操作:Set 提供了丰富的操作,如添加成员、删除成员、计算数量、检查成员是否存在等,这些操作都是 O(1) 复杂度,性能非常高。

6. 总结

通过结合 Spring Boot 3Redis,我们可以轻松实现高效的点赞功能,并利用 Redis 的 Set 数据结构实现去重、快速统计等操作。相比于传统的数据库操作,使用 Redis 实现的点赞功能性能更高、扩展性更好,尤其适合用户量大、点赞操作频繁的应用场景。

持久化到数据库

仅使用 Redis:适用于对数据一致性要求不高的场景,比如短期有效的点赞数据,或者系统对少量点赞数据丢失不敏感。

Redis + MySQL方案:适用于对数据一致性要求高的场景,比如电商、社交平台中,点赞数据不能丢失,且需要长期保存。通常采用异步持久化,具体流程可以是:

  1. 用户点赞时,首先将数据写入 Redis。
  2. 通过定时任务(如每隔几分钟)或消息队列,将 Redis 中的点赞数据同步到数据库。
  3. 在定时任务或队列消费过程中,可以批量将点赞数据写入数据库,降低数据库的写入压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560786.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【排序算法】快速排序、冒泡排序

文章目录 快速排序1.hoare版本&#xff08;左右指针法&#xff09;时间复杂度、空间复杂度分析优化——三数取中法2.挖坑法3.前后指针版本优化&#xff1a;小区间优化快速排序非递归代码——借助栈 冒泡排序时间复杂度 快速排序 1.hoare版本&#xff08;左右指针法&#xff09…

c++类与对象下速成

本篇文章继续讲解类与对象 再次探索初始化列表 特点&#xff1a; 1.每个成员变量在初始化列表中只能出现⼀次 2.引⽤成员变量&#xff0c;const成员变量&#xff0c;没有默认构造的类类型变量&#xff0c;必须放在初始化列表位置进⾏初始化 3.C11⽀持在成员变量声明的位置给…

人工智能从业人员“计算机视觉设计开发工程师专项培训(第七期)通知!

关于开展人工智能从业人员“计算机视觉设计开发工程师专项培训 (第七期)的通知&#xff01; 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国务院印发《关于“十四五”数字经济发展规划》等有关工作的部署要求&#xff0c;深入实施人才强国战略和创新…

【vue】监听table水平滚动条切换tab后还原位置

有个需求就是切换tab后&#xff0c;原先的table水平滚动条要还原位置&#xff08;如下图&#xff09;&#xff0c;先说下思路&#xff0c;大致就是 切出页面时 把滚动距离保存到Storage 中&#xff0c;切回来时在恢复 直接上代码 首先table ref指定一下ref"jtable" …

如何从回收站恢复永久删除的文件

我们每个人都有一些重要的数据&#xff0c;这些数据对我们的专业和个人工作都很有用。最糟糕的噩梦就是不小心从电脑中删除了重要文件。当你清空回收站时&#xff0c;情况就变得无法控制了。如果你遇到这种情况&#xff0c;别担心&#xff1b;我们今天在这里帮助你 在清空回收站…

ArgoCD如何使用ArgoCD CLI

1.下载CLI工具 2.添加到环境变量&#xff0c;或者创建/usr/bin的快捷方式 3. 获取API Server 地址 首先&#xff0c;你需要获取Argo CD API server的访问地址。如果你使用的是端口转发来访问Argo CD的控制台&#xff0c;API server的地址通常是 localhost 和与端口转发命令中…

LabVIEW开关磁阻电机特性测量系统

基于LabVIEW软件和特定硬件组件的开关磁阻电机&#xff08;SRM&#xff09;特性测量系统&#xff0c;结合多功能数据采集卡&#xff0c;统能够准确地测量并分析SRM的电磁特性&#xff0c;从而支持电机模型的精确建立和性能优化。 项目背景 在工业生产和家用电器领域&#xff0…

建站:腾讯云+宝塔linux+xftp

1.首先&#xff0c;控制台&#xff0c;服务器 2.服务器-网络与域名-ip地址&#xff0c;能看到公网地址 3.宝塔Linux面板-网站-添加站点 4.填写域名会自动生成 ftp 帐号密码 域名可以加上端口&#xff0c;端口号可以写大点 5.xftp新建会话 主机地址&#xff1a;腾讯云拿到的公…

免费又好用的保护网站WAF,基于语义引擎的waf雷池社区版推荐

为什么传统规则防护失效了&#xff1f;&#x1f914; 目前&#xff0c;大多数 Web 应用防火墙&#xff08;WAF&#xff09;依赖规则匹配来识别和阻断攻击流量。然而&#xff0c;随着 Web 攻击的低成本、复杂多样的手段和频繁爆发的高危漏洞&#xff0c;管理人员不得不频繁调整防…

网络参考模型

OSI七层网络参考模型 OSI模型仅作为参考&#xff0c;现实中并不用&#xff0c;OSI模型的目的是为了解决主机之间的网络通讯。 1. 物理层&#xff1a; 物理层将由比特&#xff08;0和1&#xff09;组成的数据用不同的媒介&#xff08;电、光或其他形式的电磁波&#xff09;传输…

解决Microsoft store下载/更新时出现错误代码: 0x80070422的方法

首先winr&#xff0c;输入services.msc打开服务面板 找到Microsoft store安装服务这一项&#xff0c;双击打开 启动类型设为自动或手动&#xff0c;然后启动&#xff0c;点击确定即可

Vatee万腾平台:开启企业数字化新纪元的钥匙

在当今瞬息万变的商业环境中&#xff0c;企业数字化转型已成为不可逆转的趋势。这一转型不仅关乎企业的生存与发展&#xff0c;更是企业在激烈的市场竞争中保持领先地位的关键。Vatee万腾平台&#xff0c;作为数字化领域的佼佼者&#xff0c;正以其卓越的性能和广泛的应用场景&…

薪资与职级全景:一览互联网巨头的晋升之路

薪资与职级全景&#xff1a;一览互联网巨头的晋升之路 帮大家整理了包含阿里巴巴、腾讯、百度、字节跳动、华为、京东、美团、滴滴、小米 9*多家 家互联网大厂的薪资、职级、考核、晋升**等内容。 &#xff08;超多内容&#xff0c;建议收藏起来慢慢看&#xff09; 字节跳动 全…

什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

一、什么是虚拟DOM 虚拟 DOM (Virtual DOM )这个概念相信大家都不陌生,从 React 到 Vue ,虚拟 DOM 为这两个框架都带来了跨平台的能力(React-Native 和 Weex) 实际上它只是一层对真实DOM的抽象,以JavaScript 对象 (VNode 节点) 作为基础的树,用对象的属性来描述节点,…

开放式耳机哪个品牌好?2024开放式蓝牙耳机排行榜推荐

​在当今的耳机界&#xff0c;开放式耳机凭借其舒适的佩戴感和新颖的非入耳构造&#xff0c;赢得了众多用户的青睐。这种耳机设计让你在享受音乐的同时&#xff0c;还能清楚地听到周围的声音&#xff0c;方便交流&#xff0c;对耳朵健康也更友好。对于喜欢运动和追求音质的朋友…

【Golang】Go多线程中数据不一致问题解决方案--sync锁机制

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

怎样批量删除大量的QQ邮件?

当你的QQ邮箱中存在大量的邮件&#xff0c;手动删除的话&#xff0c;只能批量删除一页数据&#xff0c;显得很费力&#xff01;我教大家一个快速删除邮件的方法&#xff1a; 第一步&#xff1a;设置收信规则 第二步&#xff1a;利用收信规则&#xff0c;可将将收件箱中的文件…

C++:vector(题目篇)

文章目录 前言一、只出现一次的数字二、只出现一次的数字 II三、只出现一次的数字 III四、杨辉三角五、删除有序数组中的重复项六、数组中出现次数超过一半的数字七、电话号码的字母组合总结 前言 今天我们一起来看vector相关的题目~ 一、只出现一次的数字 只出现一次的数字…

echarts 中添加图片/图标

let myChart echarts.init(this.$refs.chartOne); // 注意这里的 ref 引用 myChart.setOption({ tooltip: {trigger: item,formatter: {b} : {c}},series: [{type: pie,radius: 50%,data: this.swjList,label: {formatter: (params) > {if (params.name ! ) {let percent…

程序设计基础I-实验7 函数(编程题)

7-1 sdut- C语言实验—计算表达式 计算下列表达式值&#xff1a; 输入格式: 输入x和n的值&#xff0c;其中x为非负实数&#xff0c;n为正整数。 输出格式: 输出f(x,n)&#xff0c;保留2位小数。 输入样例: 3 2输出样例: 在这里给出相应的输出。例如&#xff1a; 2.00 …