• 作者:老汪软件技巧
  • 发表时间:2024-09-19 11:32
  • 浏览量:

一、简介

在开发中,UV(独立访客)和 PV(页面浏览量)是衡量网站流量与用户行为的重要指标。通过这些数据,团队可以了解网站的受欢迎程度和用户的行为模式。那么,如何不仅准确统计这些数据,还能将它们以直观的方式展示出来呢?本文将带你从后端数据统计到前端可视化展示,完整地讲解如何通过 ECharts 将 UV 和 PV 数据生动地呈现出来。无论你是刚接触这类分析,还是想提升项目中的可视化效果,这篇文章都将为你提供实用的指导。

二、从 UV 和 PV 开始:流量数据到底是什么?

在统计 UV(Unique Visitors)、PV(Page Views)和 IP(Internet Protocol Address)之前,先简单了解它们的含义。

UV 侧重用户数量,PV 反映用户行为,IP 则提供网络来源信息。接下来,我们将介绍如何通过后端统计这些数据并实现可视化展示。

三、后端统计:UV 和 PV 数据的获取方式日志分析法:从服务器日志中提取流量数据

使用日志分析法统计 UV 和 PV 是常见的后端方案,通常基于服务器自动生成的访问日志。这些日志记录了每一次请求的详细信息,包括 IP 地址、访问时间、请求的 URL 等。通过解析这些日志,可以统计出网站的访问量和用户行为,如图:

日志可选来源ELK(Elasticsearch, Logstash, Kibana) :一个强大的开源日志收集、存储和可视化分析套件。Fluentd:开源的数据收集器,支持将日志从多种来源发送到不同存储系统。Graylog:集中化日志管理平台,提供实时日志分析和搜索功能。Splunk:企业级日志分析平台,支持实时日志数据的采集、分析和可视化。Prometheus:主要用于监控的系统,可收集时间序列数据并结合 Grafana 进行日志可视化。本地日志记录:服务器自动生成的日志文件,简单易用,适合小规模项目。我们选择最简单的一种 : 统计本地日志记录

本地日志记录通常包含模块、用户信息、IP 地址、时间戳、请求 URL 等关键信息。通过分析这些日志,我们可以从中提取访问量(PV)、独立访客数(UV)和独立 IP 数。

在 MyBatis 中,我们可以通过编写如下 SQL 查询,通过时间范围过滤日志,获取每天的 PV、UV 和 IP 信息:

<select id="getVisitData" resultType="com.yf.model.bo.VisitCount">
    SELECT DATE_FORMAT(create_time, '%Y-%m-%d') AS date,
        COUNT(*) AS pvCount,
        COUNT(DISTINCT operator_name) AS uvCount,
        COUNT(DISTINCT operator_ip) AS ipCount
    FROM operate_log
    WHERE create_time BETWEEN #{startDateTime}
      AND #{endDateTime}
    GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d')
select>

这样可以简单高效地统计每日的访问情况。

统一拦截法:利用请求拦截与 Redis 进行高效实时统计

在项目中,可以通过在 Nginx、网关或应用层的拦截器进行请求拦截,统计 PV(页面访问量)、UV(独立访客数)和 IP。需要注意的是,在分布式环境下,统计数据需要去重,确保同一请求仅统计一次。

在 Redis 中如何存储 UV、PV 和 IPPV(页面访问量) :每次访问时,将 PV 计数器递增。Redis 可以通过原子操作INCR实现。UV(独立访客数) :UV 可以使用 Redis 的 HyperLogLog 数据结构,HyperLogLog 支持不精确但高效的基数估算,适合统计大量用户的去重数据。IP:独立 IP 可以使用 Redis 的SET结构存储每个请求的 IP 地址,然后使用SADD来存储新 IP,通过SCARD获取独立 IP 的总数量。案例1. 存储 PV(页面访问量)

每次请求时,对 PV 计数器执行原子递增操作:

INCR page:views:count

获取 PV:

GET page:views:count

2. 存储 UV(独立访客数)

利用 Redis 的 HyperLogLog 来存储独立访客:

PFADD page:views:uv {user_id}

获取 UV:

PFCOUNT page:views:uv

3. 存储独立 IP

将访问者的 IP 地址存储在 Redis 的SET中,以去重计算独立 IP 数:

SADD page:views:ips {user_ip}

获取独立 IP 数量:

GET page:views:count

Redis 数据归档!!!

在每日定时任务(如 Spring Task、XXL-Job)中,将当天的 PV、UV、IP 数据归档存入数据库,并清除 Redis 中的计数器,确保新一天的统计正常开始。

四、前端展示:用 ECharts 将数据生动可视化

在前端页面中使用 ECharts 创建一个折线图,展示后端返回的 PV(浏览量)、UV(用户量)和 IP(访客量)数据。以下是一个简单的 ECharts 折线图模板,您可以将后端的 IP、UV、PV 数据填入对应位置进行展示。

ECharts 折线图配置

可以使用我之前编写的 useECharts 对 ECharts 进行展示。

文章链接 : 不要再编写冗余的ECharts代码了,带你封装一个EChatrs Hook

{
    tooltip: {
        trigger: "axis",
    },
    legend: {
        data: ["浏览量(PV)", "用户量(UV)", "访客量(IP)"],
        bottom: 0,
    },
    grid: {
        left: "1%",
        right: "5%",
        bottom: "10%",
        containLabel: true,
    },
    xAxis: {
        type: "category",
        data: [],  // 后端返回的日期数据
    },
    yAxis: {
        type: "value",
        splitLine: {
            show: true,
            lineStyle: {
                type: "dashed",
            },
        },
    },
    toolbox: {
        show: true,
        feature: {
            saveAsImage: { show: true }
        }
    },
    series: [
        {
            name: "浏览量(PV)",
            type: "line",
            data: [],  // 后端返回的 PV 数据
            areaStyle: {
                color: "rgba(64, 158, 255, 0.1)",
            },
            smooth: true,
            itemStyle: {
                color: "#4080FF",
            },
            lineStyle: {
                color: "#4080FF",
            },
        },
        {
            name: "用户量(UV)",
            type: "line",
            data: [],  // 后端返回的 UV 数据
            areaStyle: {
                color: "rgba(103, 194, 58, 0.1)",
            },
            smooth: true,
            itemStyle: {
                color: "#67C23A",
            },
            lineStyle: {
                color: "#67C23A",
            },
        },
        {
            name: "访客量(IP)",
            type: "line",
            data: [],  // 后端返回的 IP 数据
            areaStyle: {
                color: "rgba(103, 194, 58, 0.1)",
            },
            smooth: true,
            itemStyle: {
                color: "#E6A03E",
            },
            lineStyle: {
                color: "#E6A03E",
            },
        },
    ],
}

后端返回数据示例

后端接口返回的 PV、UV、IP 数据格式如下:

{
    "data": {
        "dates": ["2024-09-12", "2024-09-13", "2024-09-14", "2024-09-15", "2024-09-16", "2024-09-17", "2024-09-18"],
        "ipList": [4, 2, 0, 0, 0, 0, 15],
        "pvList": [23, 11, 0, 0, 0, 0, 49],
        "uvList": [3, 3, 0, 0, 0, 0, 2]
    }
}

展示效果

五、结束语 & 源码

本文展示了使用 Redis 实现实时统计 PV、UV、IP 的方法,并通过 ECharts 将这些数据可视化呈现。通过这种方案,您可以高效管理并监控网站的流量,确保数据准确性和实时性。

为了简洁起见,本文仅包含了核心代码及实例说明。更多详细信息和完整的代码实现,欢迎访问项目的源码仓库:源码地址。

感谢阅读!