【Spring Boot】使用Redis 来实现文章的点赞量、收藏量、阅读量以及评论量的计数统计

使用 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

通过以上步骤实现文章的点赞量、收藏量、阅读量以及评论量的高效计数统计。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值