每天百万访问也不怕,Redis帮你搞定UV统计

举报
云惰雨闲 发表于 2025/09/22 17:33:45 2025/09/22
【摘要】 本文介绍了使用Redis实现高性能UV统计系统的方法。Redis凭借其内存数据库特性,支持毫秒级响应和自动去重,非常适合高并发场景下的访客统计。核心思路是利用Redis的Set数据结构作为"每日签到墙",通过记录用户访问ID实现自动去重,并设置24小时过期时间。文章提供了Python代码示例,展示如何记录用户访问和获取当日UV统计数据,还可扩展实现多页面UV统计。

前言

“独乐山水,不如与人同赏。”
我们的博客不是孤芳自赏的私人花园,而是希望被看见、被阅读、被共鸣的思想空间。

我们应该如何知道自己写的内容是否真的有人看?又如何判断哪些文章更受欢迎?这时候,UV(独立访客)统计就成了衡量流量质量的关键指标。

不同于 PV(页面浏览量),UV 更关注的是“真实访问人数”。一个用户一天内多次刷新页面,只能算作一次 UV。这种去重统计方式,更能反映内容的真实影响力。

为了实现高效、准确的 UV 统计,本文将带你使用 Redis 搭建一套轻量级的统计系统。它不仅响应速度快、资源占用低,还能自动去重、定时清理历史数据,是中小型博客和高并发网站的理想选择。


一、为什么选择 Redis 来做 UV 统计?

Redis 是一种基于内存的高性能键值数据库,它的优势在于:

  • ✅ 响应速度快,毫秒级响应
  • ✅ 支持自动去重的数据结构(如 Set)
  • ✅ 可设置过期时间,自动清理历史数据
  • ✅ 支持分布式部署,适用于高并发场景

相比传统的数据库方案,Redis 更像是一个“数字清点员”,能在极短时间内完成大量数据的去重和统计工作。


二、核心思路:用 Set 实现访客“签到墙”

我们可以将 Redis 中的 Set 数据结构想象成一面“每日更新的签到墙”:

  • 每个用户就是一位访客;
  • 每天一张新墙(即一个新的 key);
  • 用户首次来访,就在墙上签名(加入 Set);
  • 再次访问则不再重复签名(Set 自动去重);
  • 最终统计签名人数,就是当天的 UV 数。

这种设计不仅简单高效,而且天然支持去重,非常适合用于 UV 场景。


三、实战演示:Python + Redis 实现 UV 记录系统

🧩 步骤一:安装 Redis 和 Python 客户端

在 Linux 上安装 Redis:

sudo apt update
sudo apt install redis-server

安装 Python Redis 包:

pip install redis

🧪 步骤二:编写 UV 统计脚本

以下是完整的实现代码,带有详细注释:

import redis
from datetime import datetime

# 连接本地 Redis,默认端口6379
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

def record_uv(user_id):
    # 构造key名,格式为 log:YYYY-MM-DD:view
    today = datetime.now().strftime('%Y-%m-%d')
    key_name = f"log:{today}:view"

    # 使用SADD命令添加用户ID,自动去重
    redis_client.sadd(key_name, user_id)

    # 设置24小时后自动过期,避免无限增长
    redis_client.expire(key_name, 86400)  # 86400秒 = 24小时

def get_today_uv():
    today = datetime.now().strftime('%Y-%m-%d')
    key_name = f"log:{today}:view"
    # 获取当前Set集合大小,即UV数
    return redis_client.scard(key_name)

📌 步骤三:在网页中调用 UV 脚本

你可以在每次用户访问页面时,记录其唯一标识(如 Cookie ID 或 Session ID):

user_id = request.cookies.get('user_id') or generate_new_user_id()
record_uv(user_id)
print("今日UV总数:", get_today_uv())

这样就能在不影响用户体验的前提下,轻松统计每天的独立访客数量。


四、进阶技巧:分页 UV、多页面统计怎么做?

如果你希望统计多个页面的 UV,比如首页、文章页、商品详情页等,只需在 key 中加入页面标识即可:

key_name = f"log:{today}:{page_id}:view"

例如:

  • log:2025-04-05:index:view
  • log:2025-04-05:product1001:view

这样,你可以轻松实现每个页面的独立 UV 统计。


五、结语:让 Redis 成为你网站的“智能记事本”

“小智治事,大智治制。”
——《资治通鉴》

Redis 就像一本会自动整理的“访客记事本”,它不仅能快速记录谁来了,还能告诉你一天来了多少人,且不会重复计算。

对于追求性能与效率的网站而言,用 Redis 实现 UV 统计是一个轻量而高效的解决方案。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。