srpingboot实现点赞收藏功能
时间: 2025-06-25 15:06:09 浏览: 9
<think>好的,我现在需要帮助用户找到在Spring Boot中实现点赞和收藏功能的示例代码。首先,我得回想一下用户之前提供的引用内容,看看里面有没有相关的信息。
用户之前引用了四篇内容,其中引用[2]、[3]、[4]提到了使用Spring Boot和Redis实现点赞、收藏以及分页排序。特别是引用[4]中有具体的代码示例,展示了点赞功能的控制器代码,使用Redis的Set集合来存储用户ID,处理点赞、取消点赞和计数。收藏功能的部分虽然没有完整代码,但提到可以同理实现,可能用ZSet或者Hash结构。引用[2]也提到使用Redis的Set和ZSet集合,可能适用于排行榜或共同关注等功能。
接下来,我需要考虑如何组织回答。用户需要示例代码,所以应该提供具体的实现步骤和代码片段。需要确保代码结构清晰,符合Spring Boot的标准做法,同时结合Redis的操作。可能还需要解释为什么选择Redis,比如高性能、原子操作支持等。
然后,我需要分模块来展示。首先点赞功能,使用Set存储每个被点赞对象的用户ID,处理添加、删除和计数。然后收藏功能,可能需要不同的数据结构,比如ZSet来记录收藏时间,方便排序或按时间查询。每个模块给出控制器代码,并解释关键点,比如RedisTemplate的使用,键的设计(如"like:objectId"和"favorite:userId:objectType")。
另外,用户可能还需要配置Redis的连接,这部分需要简要提及application.properties的设置,比如服务器地址、端口、密码等。同时,确保代码中的依赖,比如Spring Data Redis的starter已经被引入到项目中。
还需要考虑异常处理,比如重复点赞或取消未存在的点赞,但引用中的代码示例已经处理了这些情况,返回相应的提示信息。可能还要提到扩展点,比如通过AOP记录操作日志,或者集成消息队列处理大量请求,但用户当前问题可能只需要基础示例,这部分可以放在相关问题里。
最后,生成相关问题,帮助用户深入理解,比如性能优化、数据持久化、扩展功能等。这些问题应该基于实现中的关键点,比如Redis的数据结构选择、与数据库的同步策略等。
检查是否有遗漏,比如是否要处理并发情况?Redis本身是单线程的,所以操作是原子的,不需要额外处理。另外,是否需要考虑分布式环境下的问题?比如多个实例同时操作Redis,但Redis本身是中心化的,所以没问题。
总结回答结构:简介Redis的优势,点赞功能的实现(代码示例),收藏功能的实现(代码示例),配置说明,扩展建议,最后相关问题。确保代码用正确的格式,并符合用户要求的行内数学表达式和独立公式,但这里可能不需要数学公式,所以可以忽略。引用标识需要添加,但根据用户提供的引用,引用[4]是主要的代码示例来源,引用[2]和[4]都涉及实现方法,所以合理标注。</think>在Spring Boot中实现点赞和收藏功能,通常结合Redis实现高性能操作。以下是基于Redis的代码示例及实现逻辑:
---
### 一、点赞功能实现
使用Redis的`Set`集合存储每个被点赞对象(如文章、评论)的点赞用户ID,实现去重和快速查询。
```java
@RestController
@RequestMapping("/like")
public class LikeController {
@Autowired
private RedisTemplate<String, String> redisTemplate;
// 点赞
@PostMapping("/add")
public String addLike(@RequestParam String userId, @RequestParam String objectId) {
String key = "like:" + objectId;
Long result = redisTemplate.opsForSet().add(key, userId);
return result > 0 ? "点赞成功" : "请勿重复点赞";
}
// 取消点赞
@PostMapping("/cancel")
public String cancelLike(@RequestParam String userId, @RequestParam String objectId) {
String key = "like:" + objectId;
Long result = redisTemplate.opsForSet().remove(key, userId);
return result > 0 ? "取消成功" : "未找到记录";
}
// 统计点赞数
@GetMapping("/count")
public Long countLike(@RequestParam String objectId) {
String key = "like:" + objectId;
return redisTemplate.opsForSet().size(key);
}
}
```
---
### 二、收藏功能实现
使用Redis的`ZSet`(有序集合)存储用户收藏记录,通过时间戳实现按收藏时间排序。
```java
@RestController
@RequestMapping("/favorite")
public class FavoriteController {
@Autowired
private RedisTemplate<String, String> redisTemplate;
// 添加收藏
@PostMapping("/add")
public String addFavorite(@RequestParam String userId,
@RequestParam String objectId,
@RequestParam String objectType) {
String key = "favorite:" + userId + ":" + objectType;
double timestamp = System.currentTimeMillis();
Boolean result = redisTemplate.opsForZSet().add(key, objectId, timestamp);
return result ? "收藏成功" : "已存在记录";
}
// 移除收藏
@PostMapping("/remove")
public String removeFavorite(@RequestParam String userId,
@RequestParam String objectId,
@RequestParam String objectType) {
String key = "favorite:" + userId + ":" + objectType;
Long result = redisTemplate.opsForZSet().remove(key, objectId);
return result > 0 ? "移除成功" : "未找到记录";
}
// 分页查询收藏列表
@GetMapping("/list")
public Set<String> listFavorites(@RequestParam String userId,
@RequestParam String objectType,
@RequestParam int page,
@RequestParam int size) {
String key = "favorite:" + userId + ":" + objectType;
long start = (page - 1) * size;
long end = start + size - 1;
return redisTemplate.opsForZSet().reverseRange(key, start, end);
}
}
```
---
### 三、Redis配置
在`application.properties`中配置Redis连接:
```properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
```
---
### 四、扩展优化建议
1. **数据持久化**:定期将Redis中的点赞/收藏数据同步到数据库[^4]。
2. **缓存穿透处理**:对不存在的`objectId`添加空值缓存。
3. **事务支持**:使用`@Transactional`注解保证操作原子性。
4. **性能监控**:集成Spring Actuator监控Redis性能[^3]。
---
阅读全文
相关推荐


















