JAVA:利用 Redis 实现每周热评的技术指南

news2025/1/7 13:13:36

1、简述

在现代应用中,尤其是社交媒体和内容平台,展示热门评论是常见的功能。我们可以通过 Redis 的高性能和丰富的数据结构,轻松实现每周热评功能。本文将详细介绍如何利用 Redis 实现每周热评,并列出完整的实现代码。

在这里插入图片描述

2、需求分析

热评 是指在某个时间范围内(如一周内)获得最多点赞的评论。为了实现这个功能,我们可以使用 Redis 的 Sorted Set 数据结构,它可以根据评论的热度(如点赞数)对评论进行排序。

2.1 实现思路
  • 数据结构:Redis 的 Sorted Set 是非常合适的工具,它将 评论 ID 作为成员,点赞数 作为分数,按照点赞数自动排序。

  • 周期性更新:为了实现每周的热评功能,我们可以每天将新增的评论加入 Redis 中,并对 Redis 数据进行过期管理。

  • 用户操作:当用户点赞评论时,Redis 会自动更新对应评论的点赞数,系统可以根据点赞数实时排序。

2.2 Redis 数据结构设计
  • Key:存储每周热评的 Redis key 可以设计为 weekly:hot:comments:{week}, 其中 {week} 是该周的标识(如 2024-09-14)。

  • Value:使用 Redis 的 Sorted Set,将 评论 ID 作为成员,点赞数 作为分数。

3、代码实现

3.1 项目依赖

首先,确保项目中引入了 Redis 依赖(如果你使用的是 Spring Boot 和 Redis):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
3.2 热评功能的 Redis 服务类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Set;
import java.util.concurrent.TimeUnit;

@Service
public class HotCommentService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    // 获取当前周标识,通常用年份 + 周数表示
    private String getCurrentWeekKey() {
        return "weekly:hot:comments:" + System.currentTimeMillis() / (1000 * 60 * 60 * 24 * 7);
    }

    // 添加评论点赞数
    public void addCommentLike(String commentId) {
        String weekKey = getCurrentWeekKey();
        // Increment the like count (sorted set score) by 1
        redisTemplate.opsForZSet().incrementScore(weekKey, commentId, 1);
        // Set an expiration for the current week data (e.g., 7 days)
        redisTemplate.expire(weekKey, 7, TimeUnit.DAYS);
    }

    // 获取本周的热门评论
    public Set<String> getWeeklyHotComments(int topN) {
        String weekKey = getCurrentWeekKey();
        // 获取当前周点赞数最多的评论,按分数降序排列
        return redisTemplate.opsForZSet().reverseRange(weekKey, 0, topN - 1);
    }
}
3.3 Controller 层调用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Set;

@RestController
public class HotCommentController {

    @Autowired
    private HotCommentService hotCommentService;

    // 用户点赞评论接口
    @PostMapping("/like/{commentId}")
    public String likeComment(@PathVariable String commentId) {
        hotCommentService.addCommentLike(commentId);
        return "Comment liked!";
    }

    // 获取本周热门评论接口
    @GetMapping("/hot-comments/{topN}")
    public Set<String> getHotComments(@PathVariable int topN) {
        return hotCommentService.getWeeklyHotComments(topN);
    }
}
3.4 Redis 的配置

在 application.properties 中配置 Redis:

spring.redis.host=localhost
spring.redis.port=6379
3.5 代码解析
  • 点赞处理:addCommentLike(String commentId) 方法会增加评论的点赞数,每当用户点赞时,调用 Redis 的 incrementScore 方法,使该评论的得分(点赞数)增加。同时设置 Redis key 的过期时间为 7 天,以确保每周热评只保留当前周的数据。

  • 获取热评:getWeeklyHotComments(int topN) 方法通过 Redis 的 reverseRange 获取按分数降序排列的评论 ID,返回当前周内点赞数最高的评论。

  • 定期清理:通过 expire 设置 Redis key 的过期时间,避免旧的热评数据占用内存。

4、Redis 实现的优势

  • 高性能:Redis 是内存型数据库,具有极高的读写性能,特别适合处理频繁的点赞操作和快速的排名计算。

  • 实时性:利用 Redis 的 Sorted Set 数据结构,可以在每次点赞后立即更新排序,确保数据的实时性。

  • 简单实现:相比于传统关系型数据库的复杂 SQL 查询和统计操作,Redis 的 ZSet 提供了天然的排名和计数功能,极大简化了代码逻辑。

5、应用场景

  • 社交平台:用于展示每周热门评论、热门帖子,增强用户互动性。
  • 内容推荐:对文章、视频等内容的点赞数进行排序,作为推荐系统的基础数据。
  • 电商评论:可以用于电商平台展示商品的热门评论,提高用户购买决策的效率。

6、结论

通过 Redis 的 Sorted Set 数据结构,我们能够轻松实现每周热评功能。Redis 的高性能和强大的数据处理能力,使得它在处理这种实时性强、数据量大的场景中非常适用。借助 Java 和 Spring Boot 的集成,我们可以将 Redis 热评功能快速引入到应用中,提升用户体验。

Redis 的实时数据处理功能,不仅适用于热门评论的实现,还可以在其他涉及实时排序、统计的场景中广泛应用。

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

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

相关文章

LSP介绍并实现语言服务

首发于Enaium的个人博客 LSP (Language Server Protocol) 介绍 前段时间我为Jimmer DTO实现了一个 LSP 的语言服务&#xff0c;这是我第一次实现 LSP&#xff0c;所以在这里我分享一下我实现LSP的经验。 首先来看一下效果&#xff0c;图片太多&#xff0c;我就放一部分&#…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露&#xff1a;理解大型语言模型的参数量级 关键词&#xff1a; #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日&#xff0c;微软在一篇医学相关论文中意外泄露了OpenAI及Claud…

一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理

文章目录 一文大白话讲清楚TCP连接的三次握手和断开连接的四次挥手的原理1.TCP建立连接需要3次握手1.1 先讲个你兄弟的故事1.2 TCP 3次握手1.2 TCP 3次握手8件事1.3 TCP握手能不能是两次 2. TCP 断开连接要4次挥手2.1 还回到你兄弟的故事上2.2 TCP 4次挥手2.2 TCP4次挥手4件事2…

解决npm报错:sill idealTree buildDeps

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 报错信息 使用 npm 安装依赖时报错&#xff1a;sill idealTree buildDeps 解决方案 请按照以下步骤进行相关操作&#xff1a; 1、删除 C:\Users{账户}\ 文件夹中的 .npm…

Apache Celeborn 在B站的生产实践

背景介绍 Shuffle 演进 随着B站业务的飞速发展,数据规模呈指数级增长,计算集群也逐步从单机房扩展到多机房部署模式。多个业务线依托大数据平台驱动核心业务,大数据系统的高效性与稳定性成为公司业务发展的重要基石。如图1,目前在大数据基础架构下,我们主要采用 Spark、Fl…

SAP系统中的标准价、移动平均价是什么?有何区别?物料分类账的优点

文章目录 前言一、SAP系统中的价格控制二、移动平均价、标准价是什么&#xff1f;三、S价&#xff08;标准价&#xff09;的优势四、S价&#xff08;标准价&#xff09;的劣势五、V价&#xff08;移动平均价&#xff09;的优势六、V价&#xff08;移动平均价&#xff09;的劣势…

我的Java-Web进阶--SpringMVC

1.三层架构与MVC模式 三层架构 MVC模式 2.SpringMVC执行流程 3.SpringMVC的基本使用方法 1. 配置 1.1 Maven依赖 首先&#xff0c;在pom.xml文件中添加Spring MVC的依赖&#xff1a; <dependencies><!-- Spring MVC --><dependency><groupId>org.…

让css设置的更具有合理性

目录 一、合理性设置宽高 二、避免重叠情况&#xff0c;不要只设置最大宽 三、优先使用弹性布局特性 四、单词、数字换行处理 五、其他编码建议 平常写css时&#xff0c;除了遵循一些 顺序、简化、命名上的规范&#xff0c;让css具有合理性也是重要的一环。 最近的需求场…

【C++】深入理解C语言中的特殊字符处理与问题分析优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目&#xff1a;B2090 年龄与疾病输入格式输出格式输入输出样例 &#x1f4af;初始代码分析与问题排查问题点分析 &#x1f4af;修正后的代码与优化修正与优化要点 &#…

面试题解,JVM中的“类加载”剖析

一、JVM类加载机制说一下 其中&#xff0c;从加载到初始化就是我们的类加载阶段&#xff0c;我们逐一来分析 加载 “加载 loading”是整个类加载&#xff08;class loading&#xff09;过程的一个阶段&#xff0c;加载阶段JVM需要完成以下 3 件事情&#xff1a; 1&#xff0…

vue路由模式面试题

vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…

构建一个rust生产应用读书笔记7-确认邮件3

设计架构思路 从前面的学习过程中&#xff0c;我们从单一文件测试套件发展到模块化测试套件&#xff0c;并构建了一套强大的辅助工具&#xff0c;这是一个非常重要的进展。个人认为测试代码和应用代码一样&#xff0c;是一个持续进化的过程。随着项目的不断成长&#xff0c;测…

默认ip无法访问,利用dhcp功能获取ip进行访问的方法

应用场景&#xff1a; ac的默认ip如192.168.1.1在pc与ac的eth2以后网口直连无法ping通&#xff0c;而且pc改为dhcp自动获取ip也获取不到ip地址&#xff0c;无法进行web配置和命令行操作。 原因是ac或其他设备被修改了默认ip或者对应端口所属vlanid&#xff0c;现在的端口vlan…

redis的集群模式与ELK基础

一、redis的集群模式 1.主从复制 &#xff08;1&#xff09;概述 主从模式&#xff1a;这是redis高可用的基础&#xff0c;哨兵和集群都是建立在此基础之上。 主从模式和数据库的主从模式是一样的&#xff0c;主负责写入&#xff0c;然后把写入的数据同步到从服务器&#xff…

大脑特训,自信 “满格”

编辑&#xff1a;念小艺 在追求自信的漫漫长路上&#xff0c;诸多因素如同闪耀的星光&#xff0c;为人们指引着方向。保持良好的饮食习惯&#xff0c;让身体摄取充足且均衡的营养&#xff0c;为精神的饱满提供坚实后盾&#xff1b;持续投身于锻炼之中&#xff0c;在挥洒汗水的…

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论&#xff0c;切勿用于违法途径&#xff0c;所有渗透都需获取授权&#xff0c;违者后果自行承担&#xff0c;与本号及作者无关&#xff0c;请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台&#xff01;&#xff0…

计算机的发展、计算机基本组成原理

计算机系统 软件 硬件 硬件的发展 软件的发展 低级语言&#xff1a;机器语言、汇编语言 一、早期冯诺依曼机的结构 存储程序&#xff1a;将指令以二进制代码事先输入计算机的主存储器 在计算机系统软件和硬件是等效的 软件&#xff1a;数据 程序 硬件&#xff1a; 存储器、…

公共数据授权运营系统建设手册(附下载)

在全球范围内&#xff0c;许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台&#xff0c;推动数据的开放共享&#xff0c;促进数据的创新应用&#xff0c;不仅能够提高政府决策的科学性和公共服务的效率&#xff0c;还能够激发市场活力&#xff0…

[极客大挑战 2019]HardSQL 1

看了大佬的wp&#xff0c;没用字典爆破&#xff0c;手动试出来的&#xff0c;屏蔽了常用的关键字&#xff0c;例如&#xff1a;order select union and 最搞的是&#xff0c;空格也有&#xff0c;这个空格后面让我看了好久&#xff0c;该在哪里加括号。 先传入1’ 1试试&#…

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling&#xff08;事件处理&#xff09;3. Multitasking&#xff08;多任务处理&#xff09;4. Push Notifications&#xff08;推送通知&…