在网站运营中,UV(独立访客) 是衡量内容流量质量的核心指标之一。不同于 PV(页面浏览量),UV 更加关注“有多少个不同的人来过”。
这篇文章将带你用 Redis 实现一个高效、自动去重的 UV 统计系统,适合个人博客、小型站点乃至高并发平台使用。
一、为什么说 UV 比 PV 更重要?
PV(Page View)是“门庭若市”的热闹数据,但 UV(Unique Visitor)才是反映真实访问人数的关键指标。
就像一场演唱会:
- PV 告诉你一共卖了多少张票;
- UV 才告诉你来了多少位观众。
一个用户一天内刷新十次网页,只算一次 UV。这种“去重统计”方式,更贴近实际流量质量。
二、为何选择 Redis 来统计 UV?
Redis 是一款高性能的内存数据库,它不仅响应快,还支持 Set 数据结构 —— 这正是实现 UV 自动去重的完美工具。
✅ Redis 的优势:
- ⚡ 极速响应:毫秒级写入和查询
- 🧮 自动去重:Set 结构天然不重复
- 🕒 自动清理:可设置过期时间
- 🔁 灵活扩展:支持多页面、多维度统计
对于中小型项目来说,Redis 就像是一位“数字签到员”,能快速记录谁来过、来了几次,并且不会重复登记。
三、实现思路:每天一张“签到墙”
我们把 Redis 中的 Set 想象成一面每日更新的签到墙:
- 用户首次访问 → 在墙上签名(加入 Set)
- 再次访问 → 不再重复签名(Set 自动去重)
- 查看当天访客数 → 统计墙上签名总数(scard)
这样设计简单高效,又能准确记录每一天的独立访客数量。
四、实战演示:Python + Redis 实现 UV 统计系统
📦 第一步:安装 Redis 和 Python 客户端
Linux 安装 Redis:
Bash
sudo apt update
sudo apt install redis
安装 Python Redis 包:
Bash
pip install redis
💻 第二步:编写 UV 统计脚本
以下是一个完整的实现示例:
Python
import redis
from datetime import datetime
# 连接本地 Redis
client = redis.StrictRedis(host='localhost', port=6379, db=0)
def record_uv(user_id):
today = datetime.now().strftime('%Y-%m-%d')
key = f"uv:{today}"
# 使用 SADD 自动去重添加用户ID
client.sadd(key, user_id)
# 设置24小时后自动过期
client.expire(key, 86400) # 单位:秒
def get_today_uv():
today = datetime.now().strftime('%Y-%m-%d')
key = f"uv:{today}"
return client.scard(key)
这段代码实现了 UV 的完整记录逻辑:去重登记、自动过期、按日统计。
📈 第三步:在 Web 应用中调用
你可以将 record_uv()
方法嵌入你的网页请求处理流程中,比如 Flask 或 Django 视图函数:
Python
@app.before_request
def log_uv():
if request.endpoint != 'static':
user_id = request.cookies.get('uid') or str(uuid.uuid4())
record_uv(user_id)
这样,每次有非静态资源请求时,都会记录访客信息。
五、进阶玩法:不只是全站 UV,还能分页统计!
如果你希望了解每篇文章或每个栏目到底吸引了多少人,可以给 Key 加上页面标识:
Python
key = f"uv:{today}:{page_id}"
例如:
uv:2025-04-05:index
uv:2025-04-05:post1001
这样一来,你就能知道哪些文章最受欢迎,从而优化内容方向。
六、结语:Redis 是你的“智能记事本”
Redis 不只是缓存利器,更是 UV 统计的神器。它速度快、效率高、天然去重,非常适合中小型网站或高并发应用使用。
掌握这项技能,让你的内容不再只是自说自话,而是真正被看见、被理解、被传播。