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

news2024/11/19 6:18:42

更多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 {

    @Autowired
    private 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 {

    @Autowired
    private 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 {

    @Autowired
    private 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 {

    @Autowired
    private 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.coloradmin.cn/o/2200159.html

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

相关文章

linux线程 | 一篇文章带你理解线程的概念

前言:本篇讲述linux里面线程的相关概念。 线程在我们的教材中的定义通常是这样的——线程是进程的一个执行分支。 线程的执行粒度&#xff0c; 要比进程要细。 我们在读完这句话后其实并不能很好的理解什么是线程。 所以&#xff0c; 本节内容博主将会带友友们理解什么是线程&a…

vscode软件中可以安装的一些其他插件

一. 简介 前面了解了 在 做 C开发时 vscode软件需要安装的一些常用插件。文章如下&#xff1a; vscode软件在 C发中常用插件-CSDN博客 本文继续了解一些其他好用的插件。 二. vscode软件中可以安装的一些其他插件 1. 字体插件 FIRA CODE FIRA CODE 致力于提升代码的连贯…

Chromium 中chrome.history扩展接口c++实现

一、前端 chrome.history定义 使用 chrome.history API 与浏览器的已访问网页的记录进行交互。您可以在浏览器的历史记录中添加、移除和查询网址。如需使用您自己的版本替换历史记录页面&#xff0c;请参阅覆盖网页。 更多参考&#xff1a;chrome.history | API | Chrome…

LSTM 长短期记忆网络:解锁时间序列数据的深层秘密

在这个数据驱动的时代&#xff0c;理解和预测时间序列数据成为了许多领域的关键。从股票价格预测到天气模式分析&#xff0c;从自然语言处理到健康监测&#xff0c;时间序列数据无处不在&#xff0c;并且蕴含着丰富的信息。然而&#xff0c;传统的神经网络在处理这类数据时往往…

Openstack 安装教程

1.首先更新系统 sudo apt update sudo apt upgrade -y2.安装必要软件包 sudo apt install -y software-properties-common3.添加openstack官方仓库 sudo add-apt-repository cloud-archive:train sudo apt update4.安装openstack核心组件 sudo apt install -y python3-opens…

技术分享 —— JMeter接口与性能测试实战!

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

Redis-02 持久化

redis持久化即将数据从内存写入磁盘&#xff0c;Redis提供了两种持久化的方式&#xff1a;RDB和AOF。 1.RDB RDB持久化&#xff1a;Redis可以将内存中的数据定期快照保存到磁盘上的一个二进制文件中。RDB持久化是一种比较紧凑的文件格式&#xff0c;适用于备份和灾难恢复。通过…

陈零九全新单曲《也曾想走进你的心底》 揭露爱而不得的情感遗憾

图片提供&#xff1a;种子音乐 “创作男神”陈零九于10月9日推出充满深情的全新创作单曲《也曾想走进你的心底》&#xff0c;这首歌再次延续他招牌的“九式情歌”风格&#xff0c;展现其创作魅力。歌曲以一段“爱而不得”的感情故事为主线&#xff0c;深入探讨人们在爱情中的复…

java家政预约上门系统源码,家政服务平台源码,基于SpringBoot框架,数据库使用MySQL,界面渲染采用Thymeleaf技术开发

自主知识产权的家政预约上门系统源码&#xff0c;java版本&#xff0c;支持二次开发&#xff0c;适合商用上项目。 在这个快节奏的现代生活中&#xff0c;越来越多的家庭开始寻求高效、便捷的家政服务解决方案。传统的家政服务模式已经很难满足人们日益增长的个性化与即时性需求…

GAMES202作业3

EvalDiffuse 对于一个diffuse的着色点&#xff0c;它的BRDF为&#xff1a; /** Evaluate diffuse bsdf value.** wi, wo are all in world space.* uv is in screen space, [0, 1] x [0, 1].**/ vec3 EvalDiffuse(vec3 wi, vec3 wo, vec2 uv) {vec3 albedo GetGBufferDiffus…

【Linux】基本认知全套入门

目录 Linux简介 Linux发行版本 发行版选择建议 Centos-社区企业操作系统 Centos版本选择 Linux系统目录 Linux常用命令 SSH客户端 Linux文件操作命令 vim重要快捷键 应用下载与安装 netstat&#xff0c;ps与kill命令使用 Linux应用服务化 Linux用户与权限 Linu…

接口自动化测试实战

测试前准备&#xff1a; 1、项目的介绍 是一个什么项目、项目技术、项目要测的接口和业务流程、业务路径测试用例&#xff08;通过业务流程来梳理业务路径&#xff09; 2、链接和登录密码&#xff1a; 客达天下http://huike-crm.itheima.net/#/clue 客达天下账号admin&…

支持向量机-笔记

支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 是一种强大的监督学习算法&#xff0c;广泛应用于分类和回归任务&#xff0c;特别是在分类问题中表现优异。SVM 的核心思想是通过寻找一个最优超平面&#xff0c;将不同类别的数据点进行分割&#xff0c;并最大…

【YOLO学习】YOLOv4详解

文章目录 1. 整体网络结构1.1 结构图1.2 创新点概括 2. 输入端创新点2.1 Mosaic数据增强2.2 cmBN策略 3. Backbone创新点3.1 CSPDarknet533.2 Mish函数3.3 Dropblock正则化 4. Neck创新点4.1 SPP模块4.2 PAN 5. Prediction5.1 Loss5.2 NMS 1. 整体网络结构 1.1 结构图 1.2 创新…

PostgreSQL学习笔记三:数据类型和运算符

数据类型和运算符 PostgreSQL 支持多种数据类型和运算符&#xff0c;以下是一些常见的数据类型和运算符的概述&#xff1a; 数据类型 基本数据类型 整数类型&#xff1a; SMALLINT&#xff1a;2 字节&#xff0c;范围 -32,768 到 32,767。INTEGER&#xff1a;4 字节&#xff0…

vue3 vue2

vue3.0是如何变快的&#xff1f; diff算法优化 vue2的虚拟dom是进行全局的对比。vue3 新增了静态标记&#xff08;patchFlag&#xff09; 在与上次虚拟节点进行比较的时候&#xff0c;只对比带有patch Flag的节点&#xff0c;并且可以通过flag的信息得知当前节点要对比的具体内…

先进封装技术 Part03---重布线层(RDL)的科普

先进封装核心技术之一:重布线层(RDL)的科普文章 1、 引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,RDL(Re-distributed Layer,重布线层)技术应运而生,成为先进封装技术中的核心之一。 2、 RDL技术…

yolov8.yaml

前面说了yolov8的核心代码放在ultralytics里面&#xff0c;今天我们一起学习一下 YOLOv8模型下的Ultralytics文件目录结构。每个文件夹都有不同的作用&#xff0c;以下是对各个文件夹的解释&#xff1a; assets: 这个文件夹通常存放与模型相关的资源文件&#xff0c;可能包括训…

MySQL五千万大表查询优化实战

背景 DBA同事在钉钉发了两张告警截图&#xff0c;作为“始作俑者”的我很心虚&#xff0c;因为刚才是我在管理后台查询数据&#xff0c;结果很久都没出来&#xff0c;并且用多个维度查了N次 问题分析 这是当天上线的功能&#xff0c;完事我立马锁定SQL然后开启排查 # 原SQL&a…

系统性能优化

在程序员的职业生涯中&#xff0c;解决当前系统问题&#xff0c;优化性能&#xff0c;是走向高阶的必经之路。如果一辈子做着后台开发&#xff0c;写着CRUD&#xff0c;QPS低于10&#xff0c;那确实没必要去做性能优化&#xff0c;因为根本用不上。性能优化范围很广&#xff0c…