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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fabric环境部署-安装Go

安装go语言环境 国内镜像&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 1.选择版本下载后解压&#xff1a;注意go1.11.linux-amd64.tar.gz换成你下的 sudo tar zxvf go1.21.linux-amd64.tar.gz -C /usr/local 2.. 创建Go目录 mkdir $HOME/go 3. 用vi打开~./bashrc&…

计算队列中的‘捣乱分子’对数:一种量化无序程度的方法

计算队列中的‘捣乱分子’对数:一种量化无序程度的方法 前言解题思路关键点实现代码时间复杂度分析前言 在日常生活中,我们经常会遇到需要排队的场景,比如买票、候车、就餐等。在理想的排队情况下,人们会按照某种顺序(如先到先服务)整齐地排成一列。然而,总有一些人不遵…

信号的产生、处理

一、信号的概念 信号是linux系统提供的一种&#xff0c;向指定进程发送特定事件的方式。收到信号的进程&#xff0c;要对信号做识别和处理。信号的产生是异步的&#xff0c;进程在工作过程中随时可能收到信号。 信号的种类分为以下这么多种&#xff08;用指令kill -l查看&…

【机器学习】机器学习的基本分类-自监督学习-对比学习(Contrastive Learning)

对比学习是一种自监督学习方法&#xff0c;其目标是学习数据的表征&#xff08;representation&#xff09;&#xff0c;使得在表征空间中&#xff0c;相似的样本距离更近&#xff0c;不相似的样本距离更远。通过设计对比损失函数&#xff08;Contrastive Loss&#xff09;&…

Flutter-插件 scroll-to-index 实现 listView 滚动到指定索引位置

scroll-to-index 简介 scroll_to_index 是一个 Flutter 插件&#xff0c;用于通过索引滚动到 ListView 中的某个特定项。这个库对复杂滚动需求&#xff08;如动态高度的列表项&#xff09;非常实用&#xff0c;因为它会自动计算需要滚动的目标位置。 使用 安装插件 flutte…

国内Ubuntu环境Docker部署CosyVoice

国内Ubuntu环境Docker部署CosyVoice 本文旨在记录在 国内 CosyVoice项目在 Ubuntu 环境下如何使用 dockermin-conda进行一键部署。 源项目地址&#xff1a; https://github.com/FunAudioLLM/CosyVoice 如果想要使用 dockerpython 进行部署&#xff0c;可以参考我另一篇博客中的…

计算机网络•自顶向下方法:网络层介绍、路由器的组成

网络层介绍 网络层服务&#xff1a;网络层为传输层提供主机到主机的通信服务 每一台主机和路由器都运行网络层协议 发送终端&#xff1a;将传输层报文段封装到网络层分组中&#xff0c;发送给边缘路由器路由器&#xff1a;将分组从输入链路转发到输出链路接收终端&#xff1…

信创云之天翼云:引领信创云时代的先锋力量

数据显示&#xff0c;2024年中国云服务市场规模已达到4242.5亿元&#xff0c;显示出各行业对信息技术软硬件的依赖程度不断加深。在国家政策的持续支持下&#xff0c;数字化转型为云服务行业带来了前所未有的发展机遇。预计到2025年&#xff0c;中国云服务市场规模将突破4795.4…

Elasticsearch:基础概念

一、什么是Elasticsearch Elasticsearch是基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产规模工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种形状和大小的数据。Elasticsearch 是…

智慧工地解决方案 1

建设背景与挑战 工地施工现场环境复杂&#xff0c;人员管理难度大&#xff0c;多工种交叉作业导致管理混乱&#xff0c;事故频发。传统管理方式难以实现科学、有效、集中式的管理&#xff0c;特别是在环境复杂、地点分散的情况下&#xff0c;监管困难&#xff0c;取证复杂。施…

若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)

若依中Feign调用具体使用 注意&#xff1a;以下所有步骤实现的前提是需要在启动类上加入注解 EnableRyFeignClients 主要是为开启feign接口扫描 1.创建服务提供者(provider) 导入依赖(我在分析依赖时发现若依本身已经引入openfeign依赖,并在此基础上自定义了自己的EnableRyF…

基于Springboot +Vue 实验课程预约管理系统

基于Springboot Vue 实验课程预约管理系统 前言 在现代教育领域&#xff0c;实验课程预约管理系统扮演着至关重要的角色。随着教学资源的日益紧张和学生需求的多样化&#xff0c;传统的人工管理方式已难以满足高效、透明的课程安排需求。基于SpringBootVue的实验课程预约管理…

CSS2笔记

一、CSS基础 1.CSS简介 2.CSS的编写位置 2.1 行内样式 2.2 内部样式 2.3 外部样式 3.样式表的优先级 4.CSS语法规范 5.CSS代码风格 二、CSS选择器 1.CSS基本选择器 通配选择器元素选择器类选择器id选择器 1.1 通配选择器 1.2 元素选择器 1.3 类选择器 1.4 ID选择器 1.5 基…

【偏好对齐】通过ORM直接推导出PRM

论文地址&#xff1a;https://arxiv.org/pdf/2412.01981 相关博客 【自然语言处理】【大模型】 ΨPO&#xff1a;一个理解人类偏好学习的统一理论框架 【强化学习】PPO&#xff1a;近端策略优化算法 【偏好对齐】PRM应该奖励单个步骤的正确性吗&#xff1f; 【偏好对齐】通过OR…

springmvc--请求参数的绑定

目录 一、创建项目&#xff0c;pom文件 二、web.xml 三、spring-mvc.xml 四、index.jsp 五、实体类 Address类 User类 六、UserController类 七、请求参数解决中文乱码 八、配置tomcat,然后启动tomcat 1. 2. 3. 4. 九、接收Map类型 1.直接接收Map类型 &#x…

第五届电网系统与绿色能源国际学术会议(PGSGE 2025)

2025年第五届电网系统与绿色能源国际学术会议(PGSGE 2025) 定于2025年01月10-12日在吉隆坡召开。 第五届电网系统与绿色能源国际学术会议&#xff08;PGSGE 2025&#xff09; 基本信息 会议官网&#xff1a;www.pgsge.org【点击投稿/了解会议详情】 会议时间&#xff1a;202…

CSS——4. 行内样式和内部样式(即CSS引入方式)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>方法1&#xff1a;行内样式</title></head><body><!--css引入方式&#xff1a;--><!--css的引入的第一种方法叫&#xff1a;行内样式将css代码写…

彩色图像分割—香蕉提取

实验任务 彩色图像分割—香蕉提取 利用香蕉和其它水果及其背景颜色在R,G,B分量上的差异进行识别,根据香 蕉和其它水果在R,G,B分量的二值化处理&#xff0c;获得特征提取的有效区域&#xff0c;然后提取 特征&#xff0c;达到提取香蕉的目的。附&#xff1a;统计各种水果及个数…

【算法】克里金(Kriging)插值原理及Python应用

文章目录 [toc] 前言一、克里金插值原理1.1 概述1.2 基本公式1.2 权重 w i w_i wi​的确定1.3 拟合函数的确定 二、Python建模与可视化2.1 Demo2.1.1 随机生成已知格网点2.1.2 拟合2.1.3 评估内符合精度2.1.3 内插未知格网点2.1.4 画图 2.2 结果图 参考文献 前言 最近学习了一下…

QML自定义滑动条Slider的样式

代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Slider {id: controlvalue: 0.5background: Rectangle {x: control.leftPaddingy: control.topPadding …