重学SpringBoot3-集成Redis(十)之实时统计和分析

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-集成Redis(十)之实时统计和分析

  • 1. 实时统计和分析的常见场景
  • 2. 使用 Redis 数据结构进行实时统计
  • 3. 使用Redis String实现计数器
    • 3.1. 实现步骤
    • 3.2. 使用说明
    • 3.3. 演示
  • 4. 使用Redis HyperLogLog进行 UV 统计
    • 4.1. 实现步骤
    • 4.2. 使用说明
    • 4.3. 演示
  • 5. 使用Redis Sorted Set实现排行榜
    • 5.1. 实现步骤
    • 5.2. 使用说明
    • 5.3. 演示
  • 6. 使用Redis Hash实现多维度数据统计
    • 6.1. 示例场景
    • 6.2. 使用说明
    • 6.3. 演示
  • 7. 总结

在现代的分布式系统中,实时统计和分析功能变得越来越重要,尤其是在大数据场景下。实时数据的获取和处理对于业务决策、用户行为分析以及系统性能监控都至关重要。Redis 作为高性能的内存数据库,不仅支持快速的读写操作,还具备多种数据结构,使其成为实时统计和分析场景的理想选择。

在本篇文章中,我们将介绍如何通过 Spring Boot 3Redis 来实现实时统计和分析功能,并演示如何利用 Redis 的数据结构高效地处理实时数据。

1. 实时统计和分析的常见场景

实时统计和分析可以应用在各种场景中,包括但不限于以下几类:

  1. 实时用户访问统计:统计网站或应用的 PV(Page View)和 UV(Unique Visitor)等指标。
  2. 热点数据监控:监控热门商品或新闻的点击量。
  3. 系统性能监控:统计请求数量、错误率等实时监控指标。
  4. 用户行为分析:分析用户的实时操作行为,比如搜索、点击等。

在这些场景中,我们都需要快速收集、统计并分析数据,而 Redis 的数据结构能够很好地满足这些需求。

2. 使用 Redis 数据结构进行实时统计

Redis 支持多种数据结构,其中有些特别适合做实时统计和分析,比如:

  • String:用于简单的计数器。
  • Hash:用于存储多字段的统计数据。
  • HyperLogLog:用于快速估算去重后的数据量,比如 UV 统计。
  • Sorted Set:用于排序的统计场景,比如排行榜。

SptingBoot3 整合 Redis 过程见:重学SpringBoot3-集成Redis(一)基本使用。

3. 使用Redis String实现计数器

String 是 Redis 中最简单的数据结构,可以用于实现实时计数功能,比如统计页面的访问次数(PV)。

3.1. 实现步骤

  1. 每当用户访问页面时,递增计数器。
  2. 可以定期获取计数器的值,生成实时统计报告。
package com.coderjia.boot310redis.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;/*** @author CoderJia* @create 2024/10/7 下午 09:12* @Description**/
@Service
public class PageViewService {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String PAGE_VIEW_KEY = "pageView";// 记录页面访问次数public void incrementPageView() {redisTemplate.opsForValue().increment(PAGE_VIEW_KEY);System.out.println("Page view incremented.");}// 获取当前页面访问次数public long getPageViewCount() {String count = redisTemplate.opsForValue().get(PAGE_VIEW_KEY);return count == null ? 0 : Long.parseLong(count);}
}

3.2. 使用说明

  • incrementPageView() 方法每次调用时,页面访问量加 1。
  • getPageViewCount() 可以随时获取当前的页面访问量,实现实时统计。

3.3. 演示

image-20241007214432085

image-20241007214516833

4. 使用Redis HyperLogLog进行 UV 统计

HyperLogLog 是 Redis 提供的一个特殊的数据结构,用于统计去重后的数据量,比如用户访问量(UV)。它能够以非常小的内存代价快速估算数据的基数(即去重后的数量)。

4.1. 实现步骤

  1. 每次用户访问时,向 HyperLogLog 中添加用户标识。
  2. Redis 自动去重并估算唯一用户数量。
package com.coderjia.boot310redis.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;/*** @author CoderJia* @create 2024/10/7 下午 09:12* @Description**/
@Service
public class UniqueVisitorService {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String UV_KEY = "uniqueVisitors";// 添加用户访问记录public void addUniqueVisitor(String userId) {redisTemplate.opsForHyperLogLog().add(UV_KEY, userId);System.out.println("Added user " + userId + " to unique visitors.");}// 获取唯一访客数量public long getUniqueVisitorCount() {return redisTemplate.opsForHyperLogLog().size(UV_KEY);}
}

4.2. 使用说明

  • addUniqueVisitor(String userId) 方法用于记录用户访问,将用户 ID 添加到 HyperLogLog 中。
  • getUniqueVisitorCount() 方法返回去重后的用户数量,实现 UV 统计。

4.3. 演示

image-20241007214912614

image-20241007214954758

5. 使用Redis Sorted Set实现排行榜

对于热点商品、新闻或者高频用户操作的统计,我们可以使用 Redis 的 Sorted Set 数据结构。Sorted Set 不仅可以存储元素,还能根据元素的 score 进行排序,非常适合用来做排行榜等统计分析。

5.1. 实现步骤

  1. 每当用户进行某项操作(如点赞),我们将该操作对应的数据存入 Sorted Set 中。
  2. 使用 Sorted Set 的排序特性,我们可以实时获取操作排行榜。
package com.coderjia.boot310redis.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import java.util.Set;/*** @author CoderJia* @create 2024/10/7 下午 09:13* @Description**/
@Service
public class LeaderboardService {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String LEADERBOARD_KEY = "leaderboard";// 增加用户得分public void incrementScore(String userId, double score) {redisTemplate.opsForZSet().incrementScore(LEADERBOARD_KEY, userId, score);System.out.println("Incremented score for user " + userId + " by " + score);}// 获取前N名用户public Set<String> getTopUsers(int n) {return redisTemplate.opsForZSet().reverseRange(LEADERBOARD_KEY, 0, n - 1);}
}

5.2. 使用说明

  • incrementScore(String userId, double score) 方法用于增加用户的得分,并自动排序。
  • getTopUsers(int n) 方法返回排行榜的前 N 名用户,实现实时的排行榜功能。

5.3. 演示

image-20241007230043801

image-20241007230212929

6. 使用Redis Hash实现多维度数据统计

Hash 是 Redis 中类似于字典的数据结构,非常适合存储和操作多字段的数据。我们可以使用 Hash 实现多维度的统计分析。

6.1. 示例场景

假设我们想统计用户在某个应用中的多个操作维度(如登录次数、点击次数、购买次数等),可以将这些维度存储在 Redis 的 Hash 中。

package com.coderjia.boot310redis.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import java.util.Map;/*** @author CoderJia* @create 2024/10/7 下午 09:13* @Description**/
@Service
public class UserActionService {@Autowiredprivate StringRedisTemplate redisTemplate;private static final String USER_ACTION_KEY = "userActions";// 增加某个用户的某个操作统计public void incrementAction(String userId, String actionType) {redisTemplate.opsForHash().increment(USER_ACTION_KEY + ":" + userId, actionType, 1);System.out.println("Incremented action " + actionType + " for user " + userId);}// 获取某个用户的所有操作统计public Map<Object, Object> getUserActions(String userId) {return redisTemplate.opsForHash().entries(USER_ACTION_KEY + ":" + userId);}
}

6.2. 使用说明

  • incrementAction(String userId, String actionType) 方法用于增加用户在某个操作维度上的统计数据。
  • getUserActions(String userId) 方法返回用户的所有操作维度数据,实现多维度的统计分析。

6.3. 演示

image-20241007230557372

image-20241007230654747

7. 总结

通过 Redis 的各种数据结构,我们可以轻松实现实时统计和分析功能。无论是简单的计数器、去重统计、排行榜,还是多维度的数据统计,Redis 都提供了灵活高效的解决方案。与 Spring Boot 3 的结合,使得这些操作变得更加简洁和高效。


如果这篇文章对你有所帮助,欢迎分享给更多的开发者。你还可以在评论区分享你在实际项目中遇到的相关问题或经验,让我们共同探讨 Redis 的更多应用场景!

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

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

相关文章

原来机器学习那么简单——K近邻回归

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 一、什么是K近邻回归&#xff1f; K近邻回归&…

10.9QT对话框以及QT的事件机制处理

MouseMoveEvent(鼠标移动事件) widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 设置窗口为无边框&#xff0c;去掉标题栏等装饰this->setWi…

电脑缺失msvcr120.dll怎样修复,马上教你6种修复方法

在用电脑的时候&#xff0c;经常会碰到各种错误提示&#xff0c;比如“msvcr120.dll丢失”&#xff0c;导致的结果就是某些程序无法正常启动。那么&#xff0c;这个dll文件到底是啥&#xff0c;为什么会丢失&#xff0c;怎么解决呢&#xff1f;将通过这篇文章详细解释一下&…

智能优化算法-引力搜索优化算法(GSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 引力搜索优化算法 (Gravitational Search Algorithm, GSA) 是一种基于牛顿万有引力定律的元启发式优化算法&#xff0c;由Rashedi等人于2009年提出。GSA通过模拟天体之间的引力作用来搜索最优解&#xff0c;适用…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题&#xff0c;但是鉴于网上解决方法基本没有&#xff0c;故记录下来帮助后来者。整篇文章总结下来就是一句话&#xff1a;PyQt5和sip安装过程或安装版本有问题&#xff0c;需要重新安装。 问题与解决方法 如果PyQt5你是正…

P-Tuning v2:一种普遍有效的提示调整方法

人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型通过微调&#xff08;fine-tuning&#xff09;来适应特定任务虽然效果显著&#xff0c;但存在训练成本高、参数存储量大等问题。为了解决这些问题&#xff0c;清华大学的研究者们提出了一种名为P-Tuning v2的提示调整&am…

colab+ngork本地访问多模态大模型

allenai/Molmo-7B-D-0924 1&#xff09;colab准备环境&#xff0c;我这里用的是l4 2&#xff09;安装对应的python库 !pip install transformers Pillow requests einops!pip install accelerate>0.26.0 bitsandbytes!pip install --no-deps accelerate bitsandbytes !p…

怎么将手机备忘录传送至电脑

在数字化时代&#xff0c;手机备忘录已成为我们生活中不可或缺的一部分。无论是记录购物清单、工作事项&#xff0c;还是灵感闪现的瞬间&#xff0c;手机备忘录都能随时记录下这些宝贵的信息&#xff0c;帮助我们防止遗忘。然而&#xff0c;有时候我们需要将这些备忘录内容转移…

数字影像技术平台推动可持续发展创意产业

在这个日新月异的数字时代&#xff0c;数字影像技术平台正以前所未有的力量&#xff0c;为可持续发展创意产业注入勃勃生机与无限可能。它们不仅是技术革新的前沿阵地&#xff0c;更是推动社会进步、促进文化繁荣的绿色引擎。 从高清细腻的VR体验&#xff0c;到震撼人心的AR互…

Tailwind Css的使用

1.Tailwind Css是什么 官网解释&#xff1a;Tailwind CSS 的工作原理是扫描所有 HTML 文件、JavaScript 组件以及任何 模板中的 CSS 类&#xff08;class&#xff09;名&#xff0c;然后生成相应的样式代码并写入 到一个静态 CSS 文件中。 我的理解是利用Tailwind CSS 提供的…

共享单车轨迹数据分析:以厦门市共享单车数据为例(十)

副标题&#xff1a;共享单车与地铁站出入口分布情况探究——以厦门市为例 假期结束了&#xff0c;我们满血复活&#xff0c;继续更新&#xff01; 本篇文章我们讨论共享单车与地铁出入口的关系&#xff0c;在上一篇文章中&#xff0c;我们讨论了综合得分指数最高的地铁站——…

利用可解释性技术增强制造质量预测模型

概述 论文地址&#xff1a;https://arxiv.org/abs/2403.18731 本研究提出了一种利用可解释性技术提高机器学习&#xff08;ML&#xff09;模型性能的方法。该方法已用于铣削质量预测&#xff0c;这一过程首先训练 ML 模型&#xff0c;然后使用可解释性技术识别不需要的特征并去…

安装echarts报错:request to https://registry.npmjs.org/echarts-gl failed

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;安装echarts报错&#xff1a;request to https://registry.npmjs.org/echarts-gl failed 第一&#xff1a;报错问题&#xff1a;链接…

Codeforces Round 923 (Div. 3) F. Microcycle

题目 【坑点】&#xff1a;不能先用拓扑排序去掉“线头”&#xff0c;然后找权重最小的边所在的环。因为去掉线头后&#xff0c;可能有的边不在环内。 e.g.有六条无向边 1 - 2 , 2 - 3, 1 - 3, 4 - 5, 5 - 6, 4 - 6, 1 - 4, 边1 - 4不在环内 wa代码&#xff1a; #include &…

【FPGA开发】Modelsim仿真精度的坑

问题所在 最近在使用黑金的AXU3EG板卡对着正点原子ZYNQ7020的例程进行移植学习。但在编写tb代码以及使用modelsim进行仿真时出了问题&#xff0c;发现我的实际波形与正点的对不上&#xff0c;仔细测量一下波形发现&#xff0c;我的系统时钟是6ns周期&#xff0c;而不是理想中的…

儿童(青少年)可以参加哪些含金量高的比赛?

随着素质教育的推进&#xff0c;越来越多的家长和老师开始关注如何培养孩子的综合素质和能力。而参加各类比赛&#xff0c;不仅可以锻炼孩子的思维、动手能力和团队合作精神&#xff0c;还能帮助孩子在学习的过程中找到兴趣点和成就感。尤其是一些含金量高的比赛&#xff0c;不…

QT实现QMessageBox中文按钮

这是我记录Qt学习过程心得文章的第二篇&#xff0c;主要是为了方便QMessageBox弹出框的使用&#xff0c;通过自定义的方式&#xff0c;将其常用的功能&#xff0c;统一封装成一个函数&#xff0c;还是写在了Skysonya类里面。 实现代码&#xff1a; //中文提示对话框 bool Sky…

DAMA数据管理知识体系(第12章 元数据管理)

课本内容 12.1 引言 图12-1 语境关系图&#xff1a;元数据概念理解 元数据的信息范围很广&#xff0c;不仅包括技术和业务流程、数据规则和约束&#xff0c;还包括逻辑数据结构与物理数据结构等。它描述了数据本身&#xff08;如数据库、数据元素、数据模型&#xff09;&#x…

noexcept

作用 性能优化&#xff1a;当一个函数声明为noexcept时&#xff0c;编译器可以假设该函数不会抛出异常&#xff0c;从而避免生成与异常处理相关的额外代码。这可以减少程序的运行时开销&#xff0c;特别是在那些不使用异常的代码路径上。 使用 通const一样&#xff0c;声明和…

java动态规划背包问题

代码功能 在不超过给定背包容量&#xff08;capacity&#xff09;的前提下&#xff0c;从一系列具有特定重量&#xff08;weights&#xff09;和价值&#xff08;values&#xff09;的物品中选择若干物品&#xff0c;使得这些物品的总价值最大化。 类定义&#xff1a;定义了一…