Redis --- 使用HyperLogLog实现UV(访客量)

UVPV 是网站或应用数据分析中的常用指标,用于衡量用户活跃度和页面访问量。


UV (Unique Visitor 独立访客)

  • 指的是在一定时间内访问过网站或应用的独立用户数量
  • 通常根据用户的 IP 地址、Cookies 或用户 ID 等来唯一标识一个用户。
  • 示例:同一个用户访问页面 3 次,仍然算作 1 个 UV。

PV (Page View 页面访问量)

  • 指的是某个页面在一定时间内被访问的次数
  • 每次页面加载或刷新都会计为一次 PV。
  • 示例:如果一个用户打开页面并刷新 3 次,那么这 3 次都算作 3 次 PV。

UV 是统计独立访客的数量,我们可以通过 Redis 的 Set 数据结构来实现。Set 是一个不允许重复的集合,因此可以利用这一特性避免重复计数。但是如果用户量非常大,使用 Set 来存储用户 ID 会消耗很多内存 ,这时可以使用 Redis 提供的 HyperLogLog 数据结构来估算 UV

HyperLogLog 用于基数统计,能够以非常低的内存消耗计算大规模数据的基数 (如独立访客数)。然而,它不会像 Set 一样准确存储所有数据,而是使用概率统计来给出一个近似值,误差通常小于 0.81% 左右,所以我们通常使用其来统计UV。 逐个存储 (一个一个存储)元素到 HyperLogLog 会在某些情况下增加误差。

Redis 提供的 HyperLogLog 命令

  • PFADD key element [element ...]:向 HyperLogLog 数据结构添加元素,Redis 将会使用这些元素估算基数。
  • PFCOUNT key [key ...]:返回一个或多个 HyperLogLog 估算的基数。

使用 HyperLogLog 估算独立访客数(UV):

java 复制代码
String userKey = "page:uv:homepage";
String userId = "user123";  // 用户唯一标识
jedis.pfadd(userKey, userId);  // 将用户 ID 添加到 HyperLogLog 中

查询估算的 UV 数量:

java 复制代码
Long uvEstimate = jedis.pfcount("page:uv:homepage");
System.out.println("估算的独立访客数:" + uvEstimate);

使用 HyperLogLog 进行 UV 估算时,内存消耗较少,但是由于其是基于概率算法,因此存在一定的误差,适合用于大规模数据分析。

java 复制代码
@SpringBootTest
public class HmDianPingApplicationTests {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Test
    public void hyperLogLogTest(){
        // 模拟庞大数据
        String[] values = new String[1000];
        int j = 0;
        for(int i = 0; i < 1000000; i++){
            j = i % 1000;
            values[j] = "user_" + i;
            if(j == 999) {
                // 发送到Redis中
                stringRedisTemplate.opsForHyperLogLog().add("hl2",values);
            }
        }
        // 统计数量
        Long count = stringRedisTemplate.opsForHyperLogLog().size("hl2");
        System.out.println(count);
    }

}

而HyperLogLog 不适合计算 PV,因为 PV 需要精确计数每一次页面访问,而 HyperLogLog 只用于估算基数。计算 PV 应该使用 Redis 的 String 类型,并通过 INCRINCRBY 命令来增加访问计数。


HyperLogLog 是一种高效的基数估算方法,适用于大数据量场景,能够以非常低的内存消耗提供基数(UV)估算。而 PV 则需要精确计数,因此需要使用字符串计数器。逐个存储 (一个一个存储)元素到 HyperLogLog 会在某些情况下增加误差。

相关推荐
接着奏乐接着舞。4 小时前
【2026】73道Redis 常见面试题与参考答案
数据库·redis·后端·缓存
ApacheSeaTunnel8 小时前
用 Apache SeaTunnel 同步 DynamoDB 到 Redis,一个配置文件就够
redis·开源·seatunnel·数据同步·dynamodb
MetaLite11 小时前
SpringBoot防重复提交-加一把Redis锁就够吗
spring boot·redis·后端
Seraphina3611 小时前
记一次实验:利用缓存服务器规范化技术进行网页缓存欺骗
经验分享·笔记·网络安全·缓存
长江后浪博客15 小时前
陶瓷盘UV喷墨印刷中的Z轴高度测量与防碰撞技术方案
数码相机·uv·陶瓷盘uv打印·uv喷墨印刷·z轴测高·喷头防碰撞·激光位移传感器
草莓熊Lotso2 天前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
小白勇闯网安圈2 天前
String、Hash、List、Set 四大数据结构与通用命令
redis
云存储小天使2 天前
训练效率提升50%以上:GooseFS 写缓存及其在具身智能数据处理中的应用
缓存·腾讯云·对象存储·goosefs
2601_962071172 天前
八. Spring Boot2 整合连接 Redis(超详细剖析)
spring boot·redis·后端
程序员夏洛2 天前
Redis 数据过期后的删除策略是什么?
数据库·redis·缓存