Redis:原理速成+项目实战——Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

news2024/9/24 3:19:56

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:Redis:原理速成+项目实战——Redis实战14(BitMap实现用户签到功能)
📚订阅专栏:Redis:原理速成+项目实战
希望文章对你们有所帮助

这篇是实战部分的终结篇,其实Redis的核心操作,主要是在实战部分的秒杀业务的,这里面有很多的细节:缓存、分布式锁、异步线程实现秒杀,这里面有很多的细节,可以去看这几篇文章:
Redis:原理速成+项目实战——Redis实战7(优惠券秒杀+细节解决超卖、一人一单问题)
Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)
Redis:原理速成+项目实战——Redis实战9(秒杀优化)
Redis:原理速成+项目实战——Redis实战10(Redis消息队列实现异步秒杀)
本文只是对这个项目再拓展一个基于Redis的功能。

目前为止虽然项目功能上比较完善了,但是用到的Redis基本都是单结点的,多结点的我只是简单演示过demo。
这篇结束后要单独开一个专栏了,实现Redis的高级操作:Redis持久化、Redis主从模式、Redis哨兵机制以及Redis的分片集群
除此之外,还会进行Redis原理的更深入的剖析,将会自己做一点总结,为了将来的面试。
但是想冲好实习的话,除了Redis高级部分以及其底层原理,还非常需要快点将技术栈叠高一点,因此,后面的总结可能进度会很慢了。

Redis企业级项目实战终结篇(HyperLogLog实现UV统计)

  • HyperLogLog的用法
  • 测试百万数据的统计

HyperLogLog的用法

先搞懂两个概念:
1、UV:全称Unique Visitor,也叫独立访客量,是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站,只记录1次。
2、PV:全称Page View,也叫页面访问量或点击量,用户每访问网站的一个页面,记录1次PV,用户多次打开页面,则记录多次PV。往往用来衡量网站的流量。

UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。但是如果每个访问的用户都保存到Redis中,数据量会非常恐怖。

HyperLogLog是LogLog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储器所有值,具体的原理涉及了很多数学,大家可以自行去了解。

Redis中的HLL是基于String结构实现的,单个HLL的内存永远小于16kb,内存占用非常低,其代价就是测量结果是存在概率性的,有0.8%的误差,这个误差其实也是很小了。如果能忍受这个误差就可以去用。
在这里插入图片描述
不管用PFADD添加多少个重复元素,用PFCOUNT都不会重复计数,天生就适合用来做UV统计。

测试百万数据的统计

百万用户访问的数据,这可并不好搞,所以直接用单元测试,向HyperLogLog中添加100万条数据,查看内存占用以及统计的效果。
首先利用命令查看当前内存使用情况:
在这里插入图片描述
测试类如下:

	@Test
    void testHyperLogLog(){
        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 = " + count);
    }

在这里插入图片描述
准确率还是很高的。

内存占用情况:
在这里插入图片描述
可以发现,这并没有牺牲太多的内存。

这种准确率已经非常的好了,以后要做UV统计,直接把数据往里面塞就可以了,真的遇到很多的用户,要这么去存储用户的时候,也是很容易做出来的。

到这里,Redis的所有实战都已经完成了,目前为止我已经算是完成了一个比较企业级的项目了,虽然这个功能只是做了个功能测试。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open CASCADE学习|基于visual studio 2022编译源码

目录 1、简介 2、下载 2.1下载visual studio 2022 community 2.2下载下载cmake工具 2.3下载源码 2.4下载第三方插件 3、安装 3.1安装visual studio 2022 community 3.2安装cmake 4、编译源码 5、测试 1、简介 Open CASCADE&#xff08;简称…

maya , motionbuilder 骨骼动画相关操作与脚本

文章目录 Maya导入时增加namespacemaya 解除/增加父子关系maya 修改骨骼局部坐标系显示骨骼局部坐标系删除不需要的骨骼重命名骨骼重定向基础细节 Motionbuildermb同时打开两个动画文件 Maya 导入时增加namespace import pymel.core as pm pm.namespace(add"src") …

蓝桥杯省赛无忧 STL 课件16 set

01 set集合 修改set比较方法的常见手段&#xff0c;后面的multiset类似 #include<bits/stdc.h> using namespace std; int main() {set<int,greater<int>> myset;myset.insert(25);myset.insert(17);myset.insert(39);myset.insert(42);for(const auto&…

【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

Binder 机制 javanative

一&#xff1a;Binder介绍 Binder是一套ipc通信方案 Binder框架定义了四个角色&#xff1a; Server &#xff0c;Client&#xff0c;ServiceManager &#xff08;以后简称SMgr&#xff09;以及Binder驱动。其中Server &#xff0c;Client&#xff0c;SMgr运行于用户空间&#…

SRM供应商招标采购管理系统(源码)

软件相关资料获取&#xff1a;点我获取 一、SRM供应商在线采购 SRM供应商在线采购是指企业通过互联网平台&#xff0c;实现对供应商的在线招募、选择、关系管理等一系列活动。这种采购方式具有高效、透明、便于管理的特点&#xff0c;能够帮助企业降低采购成本&#xff0c;提…

AI副业拆解:「一键解锁」告别熬夜赶PPT,AI大模型带你秒变高效演示达人!

今天&#xff0c;我注意到一条新闻报道&#xff0c;揭示了今年全球及国内科技企业正激烈竞争&#xff0c;纷纷借力大模型技术扩展各自的商业疆界。据统计&#xff0c;截至今年7月尾声&#xff0c;我国已累计推出了130个大模型项目&#xff0c;其中尤为显著的是&#xff0c;仅在…

华为设备VRRP配置

核心代码&#xff1a; 需要对所有虚拟路由器设置&#xff08;要进入到对应的端口&#xff09; vrrp vrid 38 virtual-ip 192.168.10.254 vrrp vrid 38 priority 120 vrrp vrid 38 track int g0/0/1 reduced 30①mac由vrid生成 ②指定虚拟ip ③虚拟ip作为内部主机的网关&#x…

软件测试|Python数据可视化神器——pyecharts教程(十)

使用pyecharts绘制漏斗图 简介 漏斗图&#xff08;Funnel Chart&#xff09;是一种用于可视化数据流程或转化率的图表类型。它通常由一系列阶段组成&#xff0c;每个阶段都有一个名称和一个值&#xff0c;表示在该阶段的转化量或数据流程的进展情况。漏斗图的名称来源于其外观…

OpenAI ChatGPT-4开发笔记2024-06:最简Embedding

Embedding embedding直译是&#xff1a;嵌入。和实际意思有些差距。其实就是把文本转换为向量表示的过程。用“向量化”更直接&#xff0c;但这又和tensor有点儿混。它是变成向量的一个过程。 embedding 的应用领域&#xff1a; 文本分类&#xff1a; 将文本嵌入转换为向量后…

HCIP-1

一、网络类型&#xff1a; 点到点 BMA&#xff1a;广播型多路访问 – 在一个MA网络中同时存在广播&#xff08;洪泛&#xff09;机制 NBMA&#xff1a;非广播型多路访问—在一个MA网络中&#xff0c;没有洪泛机制 MA&#xff1a;多路访问 在一个网段内&#xff0c;存在的节…

SQL Server 配置远程连接

Windows 安装好 SQL Server 的 SSMS,打开SSMS配置远程连接 找到 配置管理器 启用 TCP/IP 打开防火墙设置 新建入站规则 端口TCP - 特定本地端口 (1433)允许连接下一步名称完成 重启 SQL Server 服务

深入理解 Spark(二)SparkApplication 提交和运行源码分析

spark 核心流程 yarn-client yarn-cluster spark 任务调度 spark stage 级别调度 spark task 级别调度 失败重试和白名单 对于运行失败的 Task&#xff0c;TaskSetManager 会记录它失败的次数&#xff0c;如果失败次数还没有超过最大重试次数&#xff0c;那么就把它放回待调…

教育观察期刊投稿邮箱、投稿要求

《教育观察》创刊于2012年&#xff0c;是国家新闻出版总署批准的正规教育类学术期刊&#xff0c;本刊致力于在教育实践中以“观察”为方法&#xff0c;以“观察者”为主体&#xff0c;以“新观察”为旨趣&#xff0c;打造从教育实践中洞察教育未来的教育研究与交流的平台。主要…

软件测试|深入理解Python中的re.search()和re.findall()区别

前言 在Python中&#xff0c;正则表达式是一种强大的工具&#xff0c;用于在文本中查找、匹配和处理模式。re 模块提供了许多函数来处理正则表达式&#xff0c;其中 re.search()和 re.findall() 是常用的两个函数&#xff0c;用于在字符串中查找匹配的模式。本文将深入介绍这两…

【WEB API自动化测试】接口文档与在线测试

这一篇我们主要介绍如何做API帮助文档&#xff0c;给API的调用人员介绍各个 API的功能, 输入参数&#xff0c;输出参数, 以及在线测试 API功能(这个也是方便我们自己开发调试) 我们先来看看我们的API最终帮助文档及在线测试最终达到的效果: 概要图 GET API 添加产品API: 删除…

电影开场后也能退票,“电影仅退款”能治烂片病吗?

1月11日&#xff0c;“#电影开场后也能退票了#”词条登上微博热搜。 根据央视六套《中国电影报道》&#xff0c;从今年元旦开始&#xff0c;湖南长沙部分影院开启了新型电影保险模式的试点。 在电影开场后30分钟以内&#xff0c;市民如果对电影内容不满意&#xff0c;可借助小…

超维空间S2无人机使用说明书——61、ROS无人机4G远程控制

4G模块使用说明 引言&#xff1a;为了实现对无人机的远程控制&#xff0c;我们采用了4G通信的方案&#xff0c;该方案需要硬件以及相关软件的支持。4G通信是可选择功能&#xff0c;请确认无人机型号是否选配了4G通信。 一、4G通信方案 我们的4G通信主要通过两种方式实现&…

软件测试|如何实现字典的键值互换,你会了吗?

简介 在Python中&#xff0c;字典是一种非常有用的数据结构&#xff0c;它将数据存储为键值对&#xff0c;并且键必须是唯一的。有时候&#xff0c;我们可能需要将字典的键和值互换&#xff0c;以便查找或操作数据更加方便。本文将详细介绍如何在Python中实现字典键值的互换操…

Flink(十二)【容错机制】

前言 最近已经放假了&#xff0c;但是一直在忙一个很重要的自己的一个项目&#xff0c;用 JavaFX 和一个大数据组件联合开发一个功能&#xff0c;也算不枉我学了一次 JavaFX&#xff0c;收获很大&#xff0c;JavaFX 它作为一个 GUI 开发语言&#xff0c;本质还是 Java&#xff…