使用 Redis 来实现文章的点赞量、收藏量、阅读量以及评论量的计数统计,可以通过 Redis 的原子递增操作和哈希结构来高效实现。下面是一个详细的实现方案。
1. 添加 Redis 依赖
在 pom.xml
中添加 Redis 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. 配置 Redis
在 application.properties
文件中配置 Redis 连接:
spring.redis.host=localhost
spring.redis.port=6379
3. 创建 Redis 服务类
创建一个 ArticleMetricsService
类,用于管理文章的各种计数:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class ArticleMetricsService {
private static final String ARTICLE_METRICS_KEY = "article:metrics";
@Autowired
private StringRedisTemplate redisTemplate;
private HashOperations<String, String, String> hashOps;
@Autowired
public ArticleMetricsService(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
this.hashOps = redisTemplate.opsForHash();
}
public void incrementLikes(int articleId) {
hashOps.increment(ARTICLE_METRICS_KEY, articleId + ":likes", 1);
}
public void incrementFavorites(int articleId) {
hashOps.increment(ARTICLE_METRICS_KEY, articleId + ":favorites", 1);
}
public void incrementViews(int articleId) {
hashOps.increment(ARTICLE_METRICS_KEY, articleId + ":views", 1);
}
public void incrementComments(int articleId) {
hashOps.increment(ARTICLE_METRICS_KEY, articleId + ":comments", 1);
}
public long getLikes(int articleId) {
return getMetric(articleId, "likes");
}
public long getFavorites(int articleId) {
return getMetric(articleId, "favorites");
}
public long getViews(int articleId) {
return getMetric(articleId, "views");
}
public long getComments(int articleId) {
return getMetric(articleId, "comments");
}
private long getMetric(int articleId, String metric) {
String value = hashOps.get(ARTICLE_METRICS_KEY, articleId + ":" + metric);
return value != null ? Long.parseLong(value) : 0;
}
}
4. 创建控制器
创建一个 ArticleController
类,提供 API 以便客户端可以调用来增加和获取文章的计数:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/articles")
public class ArticleController {
@Autowired
private ArticleMetricsService articleMetricsService;
@PostMapping("/{articleId}/like")
public void likeArticle(@PathVariable int articleId) {
articleMetricsService.incrementLikes(articleId);
}
@PostMapping("/{articleId}/favorite")
public void favoriteArticle(@PathVariable int articleId) {
articleMetricsService.incrementFavorites(articleId);
}
@PostMapping("/{articleId}/view")
public void viewArticle(@PathVariable int articleId) {
articleMetricsService.incrementViews(articleId);
}
@PostMapping("/{articleId}/comment")
public void commentArticle(@PathVariable int articleId) {
articleMetricsService.incrementComments(articleId);
}
@GetMapping("/{articleId}/metrics")
public ArticleMetrics getMetrics(@PathVariable int articleId) {
long likes = articleMetricsService.getLikes(articleId);
long favorites = articleMetricsService.getFavorites(articleId);
long views = articleMetricsService.getViews(articleId);
long comments = articleMetricsService.getComments(articleId);
return new ArticleMetrics(likes, favorites, views, comments);
}
static class ArticleMetrics {
private long likes;
private long favorites;
private long views;
private long comments;
public ArticleMetrics(long likes, long favorites, long views, long comments) {
this.likes = likes;
this.favorites = favorites;
this.views = views;
this.comments = comments;
}
// Getters and setters
public long getLikes() {
return likes;
}
public void setLikes(long likes) {
this.likes = likes;
}
public long getFavorites() {
return favorites;
}
public void setFavorites(long favorites) {
this.favorites = favorites;
}
public long getViews() {
return views;
}
public void setViews(long views) {
this.views = views;
}
public long getComments() {
return comments;
}
public void setComments(long comments) {
this.comments = comments;
}
}
}
5. 启动应用
在主应用类中启用 Spring Boot 应用:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
6. 测试 API
启动应用后,你可以使用以下 API 进行测试:
- 点赞:
POST /articles/{articleId}/like
- 收藏:
POST /articles/{articleId}/favorite
- 阅读:
POST /articles/{articleId}/view
- 评论:
POST /articles/{articleId}/comment
- 获取计数:
GET /articles/{articleId}/metrics
例如,使用 cURL 命令:
# 点赞
curl -X POST http://localhost:8080/articles/1/like
# 收藏
curl -X POST http://localhost:8080/articles/1/favorite
# 阅读
curl -X POST http://localhost:8080/articles/1/view
# 评论
curl -X POST http://localhost:8080/articles/1/comment
# 获取计数
curl -X GET http://localhost:8080/articles/1/metrics
通过以上步骤实现文章的点赞量、收藏量、阅读量以及评论量的高效计数统计。