Redis--HyperLogLog的指令语法与使用场景举例(UV统计)

文章目录

      • 前言
      • HyperLogLog介绍
      • HyperLogLog指令使用
      • 使用场景:UV统计

前言

  • Redis除了常见的五种数据类型之外,其实还有一些少见的数据结构,如Geo,HyperLogLog等。虽然它们少见,但是作用却不容小觑。本文将介绍HyperLogLog指令的语法和使用场景。

HyperLogLog介绍

  • HyperLogLog是Redis提供的一种不准确(标准误差为0.81%)的去重计数方案。
  • 提到去重计数,第一个想到的数据结构就是集合set,set集合可以保存数据,并用scard准确地返回集合中的数据条数,但是若数据量很大,那么使用set集合就需要相当大的存储空间,这显然不是我们想看到的结果,而对于某些统计其实并不需要特别精确的结果。
  • 对于这种情况,HyperLogLog就可以发挥大用,HyperLogLog的优势在于无论存储的数据量有多大,它都只需要12KB的存储空间(可以计算接近2^64个不同的基数)。当然它只能统计数据集的个数,而不直接存放元素,不能试图用它保存元素。另外HyperLogLog对数据集的统计也不是完全准确的,存在一定误差,可能比实际情况多或少。

HyperLogLog指令使用

  • 增加计数: pfadd key element [element…]
    在这里插入图片描述

  • 查询计数: pfcount key
    在这里插入图片描述

  • 将多个HyperLogLog合并到一个HyperLogLog中: pfmerge destkey sourcekey [sourcekey …]
    在这里插入图片描述

使用场景:UV统计

  • HyperLogLog最适合的使用场景就是做UV的统计了,简直量身定制一般。一个爆款页面的UV可能有几千万,使用HyperLogLog可以节约存储空间,并且UV的统计允许存在一定的误差。

    补充:

    • pv(page view,浏览量)
      • 页面的浏览次数,衡量网站用户访问的网页数量;
      • 用户每打开一个页面就记录1次,多次打开同一页面则浏览量累计。
    • uv(unique visitor,独立访客)
    • 1天内访问某站点的人数(以cookie为依据);
    • 1天内同一访客的多次访问只计为1个访客。
    • ip(独立ip)
    • 指1天内使用不同ip地址的用户访问网站的数量;
    • 同一IP不管访问了几个页面,独立IP数均为1。
  • 代码实现: 在代码中提供了三个方法,分别对应pfadd添加页面的UV,pfcount获取页面的UV统计结果和pfmerge合并指定页面UV。

    public class UVByHyperLogLog {
        public static void main(String[] args) {
            Jedis jedis = new Jedis("127.0.0.1");
            jedis.del(UV_PAGE_1);
            jedis.del(UV_PAGE_2);
            jedis.del(UV_PAGE_1_2);
            
            for (int i = 0; i < 10000; i++) {
                String userid = "userid:"+Math.random()*100000;
                addCount(UV_PAGE_1,userid,jedis);
            }
            System.out.println("页面一的UV:"+getCount(UV_PAGE_1,jedis));
    
            jedis.del(UV_PAGE_2);
            for (int i = 0; i < 5000; i++) {
                String userid = "userid:"+Math.random()*100000;
                addCount(UV_PAGE_2,userid,jedis);
            }
            System.out.println("页面二的UV:"+getCount(UV_PAGE_2,jedis));
    
            //页面一和页面二合并后的UV 合并与的UV不等于两个UV的相加,一样是不精确的
            mergeCount(UV_PAGE_1_2, new String[]{UV_PAGE_1, UV_PAGE_2},jedis);
            System.out.println("合并后两个页面的UV总数"+getCount(UV_PAGE_1_2,jedis));
        }
    
        private static final String UV_PAGE_1 = "UV_PAGE_1";
        private static final String UV_PAGE_2 = "UV_PAGE_2";
    
        private static final String UV_PAGE_1_2 = "UV_PAGE_1_2";
        /**
         * 向HyperLogLog添加数据
         * @param key UV_KEY
         * @param userId 用户Id
         * @param jedis
         */
        public static void addCount(String key, String userId,Jedis jedis){
            jedis.pfadd(key,userId);
        }
    
        /**
         * 返回统计的结果
         * @param key
         * @param jedis
         * @return
         */
        public static long getCount(String key,Jedis jedis){
            return jedis.pfcount(key);
        }
    
        /**
         * 将多个pf计数合并为一个pf计数
         * @param newKey 合并后的新HyperLogLog的key
         * @param keys  要合并的HyperLogLog的key
         * @param jedis
         * @return
         */
        public static void mergeCount(String newKey,String[] keys,Jedis jedis){
            jedis.pfmerge(newKey,keys);
        }
    }
    
  • 测试结果:在上述main方法中,第一个for循环,模拟10000个用户访问页面一,第二个for循环模拟5000个用户访问页面二,通过HyperLogLog进行UV统计,输出统计结果,最后合并两个页面的统计值,观察结果后发现,HyperLogLog统计后的结果与实际结果存在误差,但是在数据量很大的情况下,这点误差误伤大雅。:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/334984.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用KTO进行更好、更便宜、更快速的LLM对齐

KTO全称为Kahneman-Tversky Optimisation&#xff0c;这种对齐方法使在我们的数据上对大型语言模型&#xff08;LLM&#xff09;进行对齐变得前所未有地容易和便宜&#xff0c;而且不会损害性能。大型语言模型的成功在很大程度上得益于与人类反馈的对齐。如果ChatGPT曾经拒绝回…

三星刚刚将Google Gemini集成到Galaxy S24中

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 AI手机的新时代即将到来。 三星刚刚将 Google Gemini 集成到 Galaxy S24 中&#xff01; 准备好迎接智能手机吧&#xff0c;它不仅智能&#xff0c;而且具有灵性。…

Jvm相关知识(面试高级必备)

类的实例化顺序 先静态、先父后子 先静态&#xff1a;父静态>子静态 优先级&#xff1a;父类>子类 静态代码块>非静态代码块>构造函数 一个类的实例化过程&#xff1a; ①&#xff0e;父类的static代码块&#xff0c;当前类的static; ②&#xff0e;顺序执行…

线程池的简单介绍及使用

线程池 线程池的参数介绍拒绝策略 线程池的任务处理流程使用Executors创建常见的线程池 线程池的参数介绍 corePoolSize: (核心线程数)这是线程池中始终存在的线程数&#xff0c;即使这些线程处于空闲状态。maximumPoolSize:(最大线程数) 是线程池允许的最大线程数。keepAliveT…

【动态规划】【C++算法】741摘樱桃

作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 LeetCode741 摘樱桃 给你一个 n x n 的网格 grid &#xff0c;代表一块樱桃地&#xff0c;每个格子由以下三种数字的一种来表示&#xff1a; 0 表示这个格子是空的&#xff0c;所以你可以穿过它。 1 表…

EasyRecovery2024数据恢复大师最新版本下载

EasyRecovery可以从初始化的磁盘恢复损坏或删除的文件。该软有易于使用&#xff0c;即使是最缺乏经验的用户也可以轻松恢复数据。一款威力非常强大的硬盘数据恢复工具。能够帮你恢复丢失的数据以及重建文件系统。EasyRecovery 不会向你的原始驱动器写入任何东东&#xff0c;它主…

深入探索 Android 中的 Runtime

深入探索 Android 中的 Runtime 一、什么是 Runtime二、Android 中的 Runtime 类型2.1. Dalvik Runtime2.2. ART&#xff08;Android Runtime&#xff09; 三、Runtime 的作用和特点3.1. 应用程序执行环境3.2. 跨平台支持3.3. 性能优化3.4. 应用程序优化 四、与应用开发相关的重…

论rtp协议的重要性

rtp ps流工具 rtp 协议&#xff0c;实时传输协议&#xff0c;为什么这么重要&#xff0c;可以这么说&#xff0c;几乎所有的标准协议都是国外创造的&#xff0c;感叹一下&#xff0c;例如rtsp协议&#xff0c;sip协议&#xff0c;webrtc&#xff0c;都是以rtp协议为基础&#…

【react】创建react项目+项目结构

使用create-react-app快速搭建开发环境 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层由Webpack构建&#xff0c;封装了配置细节 npx create-react-app react_hm执行命令后开始创建 创建好执行cd react_hm npm start 当看到webpack compiled successfu…

zookeeper window 安装

下载 Apache ZooKeeper 解压Zookeeper安装包到指定目录&#xff0c;注意目录不要有空格。 备份zoo_sample.cfg并改名zoo.cfg 注意&#xff1a;此处的路径一定要使用双斜杠" \\ " D:\\apache-zookeeper-3.8.3-bin\\data 新建环境变量&#xff1a;ZOOKEEPER_HOME D…

Kafka Console Client 的 Consumer Group

以往使用 kafka-console-consumer.sh 消费 Kafka 消息时并没有太在意过 Consumer Group&#xff0c;在命令行中也不会使用 --group 参数&#xff0c;本文针对 Kafka Console Client 命令行中的 Consumer Group 进行一次统一说明。 1. 如不设置 --group 参数会自动生成一个 Con…

亚马逊云科技 WAF 部署小指南(六)追踪 Amazon WAF Request ID,排查误杀原因

众所周知&#xff0c;中国是全球制造业的巨大力量&#xff0c;许多中国企业通过 2B 电商平台网站进行商品销售和采购。在这些电商平台上&#xff0c;Web 应用防火墙&#xff08;WAF&#xff09;成为不可或缺的安全工具。然而&#xff0c;WAF 也可能导致误杀问题。一旦误杀发生&…

CodeReview 小工具

大家开发中有没有遇到一个版本开发的非常杂&#xff0c;开发很多个项目&#xff0c;改动几周后甚至已经忘了自己改了些什么&#xff0c;领导要对代码review的时候&#xff0c;理不清楚自己改过的代码&#xff0c;只能将主要改动的大功能过一遍。这样就很容易造成review遗漏&…

从技术大会到面试舞台:程序猿的蜕变之旅!

在这个技术日新月异的时代&#xff0c;程序员们需要不断地学习和提升自己的技能。 参加技术大会&#xff0c;无疑是程序员们拓宽视野、提升技能的重要途径之一。然而&#xff0c;技术大会只是程序员成长的一部分&#xff0c;掌握面试技巧同样至关重要。只有将这两者完美结合&a…

ubuntu-20.04.6-live-server-amd64安装教程-完整版

简介 Ubuntu 20.04.6 Live Server AMD64 安装教程 - 完整版" 提供了详细的指南&#xff0c;旨在帮助用户在使用 AMD64 架构的服务器上安装 Ubuntu 20.04.6 Live Server 版本。该教程包含全面的步骤和详细说明&#xff0c;使用户能够顺利完成整个安装过程&#xff0c;建立…

【AI的未来 - AI Agent系列】【MetaGPT】5. 更复杂的Agent实战 - 实现技术文档助手

在 【AI的未来 - AI Agent系列】【MetaGPT】2. 实现自己的第一个Agent 中&#xff0c;我们已经实现了一个简单的Agent&#xff0c;实现的功能就是顺序打印数字。 文章目录 0. 本文实现内容1. 实现思路2. 完整代码及细节注释 0. 本文实现内容 今天我们来实现一个有实际意义的Ag…

test0120测试1

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

项目实战————苍穹外卖(DAY11)

苍穹外卖-day11 课程内容 Apache ECharts 营业额统计 用户统计 订单统计 销量排名Top10 功能实现&#xff1a;数据统计 数据统计效果图&#xff1a; 1. Apache ECharts 1.1 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#x…

小红书怎么种草?小红书种草玩法全攻略你不容错过!

小红书是一个以分享购物心得和生活方式为主题的社交平台&#xff0c;近年来已经成为了许多品牌进行宣传和推广的重要渠道。那么&#xff0c;品牌如何在小红书上种草&#xff0c;打造自己的形象呢&#xff1f;以下是一些实用的方法。 1.选择合适的KOL合作 在小红书上&#xff0…

完整的性能测试流程

一、准备工作 1、系统基础功能验证 性能测试在什么阶段适合实施&#xff1f;切入点很重要&#xff01;一般而言&#xff0c;只有在系统基础功能测试验证完成、系统趋于稳定的情况下&#xff0c;才会进行性能测试&#xff0c;否则性能测试是无意义的。 2、测试团队组建 根据…