Redis HyperLogLog:数据统计的轻量级解决方案

2023-12-19

引言

在现代数据驱动的应用中,Redis 以其出色的性能和灵活性成为了不可或缺的工具。

特别是在统计大量数据时,传统的计数方法往往既耗时又占用大量存储空间。

这次,阿七将介绍一种名为 HyperLogLog 的算法,它在 Redis 中的实现让大规模数据统计变得简单且高效。

深入理解 HyperLogLog

1、HyperLogLog 基础

HyperLogLog 是一种用于 估计集合中唯一元素数量的算法 ,它通过概率统计方法,在极小的内存空间内提供近似的计数结果。这种方法特别适用于需要统计巨大数据集中唯一元素数量的场景。

2、HyperLogLog 与传统方法对比

与传统的精确计数方法相比, HyperLogLog 在处理大数据集时占用极少的内存 。例如,一个包含数亿唯一元素的数据集可能只需要几百字节的内存来估算其大小。且最大只会使用 12 KB 的内存。

Redis 中的 HyperLogLog

1、Redis 与 HyperLogLog

在 Redis 中,HyperLogLog 提供了一些基本命令来处理这种类型的数据结构。以下是一些基本的 Redis 命令:

  • PFADD key element [element ...] : 向 HyperLogLog 中添加元素。
  • PFCOUNT key [key ...] : 计算 HyperLogLog 中的唯一元素数量。
  • PFMERGE destkey sourcekey [sourcekey ...] : 合并多个 HyperLogLog。

而且,HyperLogLog 提供了惊人的精度与性能平衡。通常,它的标准误差为 0.81%,这对于大多数应用来说已经足够准确。

2、 代码示例 :

// Redis HyperLogLog 操作示例
Jedis jedis = new Jedis("localhost");
String key = "page_views";

// 添加元素
jedis.pfadd(key, "user1");
jedis.pfadd(key, "user2");

// 获取估算的唯一元素数量
long count = jedis.pfcount(key);
System.out.println("Estimated unique elements: " + count);

// 合并 HyperLogLog
String otherKey = "more_page_views";
jedis.pfadd(otherKey, "user3");
jedis.pfmerge(key, otherKey);

// 再次获取估算数量
long mergedCount = jedis.pfcount(key);
System.out.println("Estimated unique elements after merge: " + mergedCount);

3、实际应用场景

1、计算网站某个功能的 UV,比如说某个网站的日访客数据。比如:有多少独立用户播放过这首歌?这一天该页面的独立访问次数有多少?有多少独立用户观看过该视频?

2、社交媒体平台可以用它来估算独特用户的参与度。

案例研究

在这部分,我们可以探讨一个基于真实数据的案例,展示如何在一个 ToC 业务中计算某个功能的使用 UV(唯一访问用户数),使用 Redis HyperLogLog 来实现。

要使用 Redis HyperLogLog 来统计每天展示的 UV,并根据用户手机的设备 UID 进行跟踪,你可以按照以下步骤实现:

设置 Redis HyperLogLog: 对于每个用户访问,你可以使用 HyperLogLog 数据结构来跟踪 UID。

业务ID + 日期为键: 使用日期作为键的一部分,这样你可以对每天的访问进行独立计数。

Java 代码实现: 使用 Jedis,这是一个流行的 Java Redis 客户端,来与 Redis 进行通信。

import redis.clients.jedis.Jedis;

public class UVCounter {
    private Jedis jedis;
    private String static final String BUSINESS_ID = "business_id";
    
    public UVCounter(String host, int port) {
        this.jedis = new Jedis(host, port);
    }

    public void addVisit(String date, String deviceUID) {
        String key = "uv:" + date;
        jedis.pfadd(key, deviceUID);
    }

    public long getUVCount(String date) {
        String key = BUSINESS_ID + ":" + "uv:" + date;
        return jedis.pfcount(key);
    }

    public static void main(String[] args) {
        UVCounter uvCounter = new UVCounter("localhost", 6379);

        // 假设这是今天的日期
        String today = "2023-12-16";

        // 模拟一些用户访问
        uvCounter.addVisit(today, "device1");
        uvCounter.addVisit(today, "device2");
        uvCounter.addVisit(today, "device3");
        uvCounter.addVisit(today, "device1"); // 重复的设备 UID

        // 获取今天的 UV 数
        long uvCount = uvCounter.getUVCount(today);
        System.out.println("Unique Visitors Today: " + uvCount);
    }
}

总结

Redis Bloom filter 大部分都知道,毕竟属于面试八股文中很重要的一个知识点。它可以用来解决缓存穿透的问题,可以判断 Redis key 是否在 DB 中,从而避免请求 DB 中不存在的数据,造成 DB 压力。

它可以使用很小的空间,存储大规模的数据。它的特点是: 判断存在不一定存在,但是判断不存在,一定不存在!

但是 Redis HyperLogLog,很多人都不知道,但是在计算大规模数据的唯一数据量级的场景下,这是一个既高效又节省空间的方法。

Redis 还提供了很多好用的工具,阿七后面会为大家继续介绍,大家可以关注我,追更不迷路!

关注同名公众号,回复「面试」两个字,送你全套 Java 面试视频,让你轻松搞定 Java 面试。还可进我免费星球,向我提问

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis HyperLogLog:数据统计的轻量级解决方案 的相关文章

随机推荐

  • 基于Apache SeaTunnel构建CDC数据同步管道

    引言 在快速发展的数据驱动时代 数据的实时 准确同步成为了企业信息系统不可或缺的一部分 随着技术的进步 特别是在分布式计算和大数据技术的背景下 构建一个高效且可靠的数据同步管道成为了挑战 Apache SeaTunnel作为一个先进的数据集
  • springboot智慧养老中心管理系统

    收藏关注不迷路 源码文章末 文章目录 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 一 项目介绍 时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 智慧养老中心管
  • 大学老师招聘要求条件

    大学老师招聘要求条件是非常严格的 因为大学教育是培养未来人才的重要阶段 需要老师具备较高的学术水平和教育能力 学历要求 一般来说 大学老师需要具备硕士及以上学历 一些热门专业或重点高校甚至要求博士学历 这是因为大学教育需要老师具备深厚的学术
  • 图神经网络在社交媒体分析中的应用优化

    如今 社交媒体已成为人们获取信息 交流和分享的主要平台之一 海量的社交媒体数据包含着丰富的信息 但如何从这些数据中提取有效的知识仍然是一个挑战 近年来 图神经网络作为一种强大的分析工具 被广泛应用于社交媒体分析中 本文将介绍图神经网络的基本
  • 手机APP测试——如何进行安装、卸载、运行?

    手机APP测试 主要针对的是安卓 Android 和苹果IOS两大主流操作系统 主要考虑的就是功能性 兼容性 稳定性 易用性 性能等测试 今天先来讲讲如何进行安装 卸载 运行的内容 一 App安装 1 点击运行APP安装包 检测安装包是否正
  • word下划线空格不延长&对齐

    空格下划线不延长 文件 选项 常规与保存 勾选 为尾部空格添加下划线 确定 下划线对齐 首行 把第一行的下划线调到满意位置 按tab键 下面的行 删到比首行短一丢丢 按tab键
  • 【2024全网最火最全性能教程】一文搞懂性能测试!

    性能测试概念 我们经常看到的性能测试概念 有人或称之为性能策略 或称之为性能方法 或称之为性能场景分类 大概可以看到性能测试 负载测试 压力测试 强度测试等一堆专有名词的解释 针对这些概念 我不知道你看到的时候会不会像我的感觉一样 乱 一个
  • 【Proteus仿真】【Arduino单片机】视力保护仪

    文章目录 一 功能简介 二 软件设计 三 实验现象 联系作者 一 功能简介 本项目使用Proteus8仿真Arduino单片机控制器 使LCD1602液晶 DS18B20温度传感器 按键 蜂鸣器 继电器开关 HC05蓝牙模块等 主要功能 系
  • @rollup/plugin-html 详解

    rollup plugin html 是 Rollup 的一个插件 用于生成 HTML 文件 并将打包后的 JS 文件引入到 HTML 文件中 该插件的配置选项如下 fileName 指定生成的 HTML 文件的文件名 默认为 index
  • 扬帆证券:如何投资股票市场?

    怎么出资股票商场 1 选择公司基本面比较强 盈余安稳的公司个股 上市公司较好的基本面会使商场资金逐渐注重 出资者增多 流入资金增多 带动个股上涨 公司的经营成绩较为安稳 商场震动也不会对它们形成过大冲击 在长期的商场趋势下 出资者可以获得较
  • 灰盒测试简要指南

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • uniapp 导入ucharts图表插件 H5项目, 使用echarts eopts配置

    先下载ucharts H5示例源码 uCharts 高性能跨平台图表库 支持H5 APP 小程序 微信小程序 支付宝小程序 钉钉小程序 百度小程序 头条小程序 QQ小程序 快手小程序 360小程序 Vue Taro等更多支持canvas的框
  • Linux操作系统基础

    Linux是一个强大的操作系统 广泛用于服务器 桌面电脑 移动设备和嵌入式系统 作为信息安全高级工程师 掌握Linux的基本操作至关重要 下面将详细介绍Linux的基本概念和命令 Linux操作系统目录结构 Linux有一个标准的文件系统层
  • UI 易用性测试 以及自动化实现!

    GUI 是指图形用户界面 UI 是指用户界面 对于纯软件系统 这两者没有本质的区别 GUI易用性测试与 UI 易用性测试内容一致 但是如果测试的对象是一个产品 这两者则存在区别 对于产品 UI 则不仅仅包括 GUI 还包括产品硬件部分的测试
  • 2.[BUU]rip

    1 检查文件 checksec 一下 查看之后发现是64位 直接放入IDA64进行反编译 2 IDA反编译 进行分析 发现是gets 函数可以造成栈溢出 从而可以覆盖栈上的内容 想法 通过gets函数 栈溢出 来篡改栈上的内容指令 从而达到
  • 网络安全日报 2023年12月19日

    1 谷歌Chrome测试新的跟踪保护可阻止第三方Cookie https blog google products chrome privacy sandbox tracking protection Google 周四宣布将开始测试一项名
  • 能够图片转word工具推荐哪一个?这些一定要试试看

    临近年末 公司上下都在为了年末盘点而忙到飞起 大家都被分配到满满的任务 我也不例外 老板交代让我把一些图片文件整理成电子文档 方便后续内容的编辑和修改 本来工作就多 加上老板的任务要得急 我也没想那么多 直接就把老板发过来的图片资料全部一股
  • 测试编排效率提升:掌握前置接口响应数据的引用方法

    宁波银行深圳分行综合柜员面经 三方寄过去了 告诉我停止24届招聘 全部毁约 牛的 he芯 毁约应届生 34316 地产投资岗上岸啦 经验分享 江西农发行市级支行信贷岗面试 最终还是搏了一把 2023届CV视觉算法岗求职记录贴 规划指南 实习
  • 计算机SSM毕设选题 在线音乐网站系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 2 1 系统开发流程
  • Redis HyperLogLog:数据统计的轻量级解决方案

    引言 在现代数据驱动的应用中 Redis 以其出色的性能和灵活性成为了不可或缺的工具 特别是在统计大量数据时 传统的计数方法往往既耗时又占用大量存储空间 这次 阿七将介绍一种名为 HyperLogLog 的算法 它在 Redis 中的实现让