Redis深入解析:HyperLogLog、Bitmap和Geospatial的奇妙应用

本文深入探讨了Redis数据库中的三种特殊数据类型:HyperLogLog、Bitmap和Geospatial。

  • HyperLogLog用于高效估算集合基数,牺牲小部分准确度以节省空间
  • Bitmap提供位操作,适用于二元数据的高效记录与查询
  • Geospatial处理地理位置数据,支持计算距离和范围搜索

HyperLogLog(基数统计)

HyperLogLog 是一种概率数据结构,用于估算集合的基数,即不重复元素的数量。

HyperLogLog通过牺牲一定的准确度来换取空间的高效利用。Redis 中的HyperLogLog实现使用最大12KB的内存,并提供小于1%的标准误差率

命令

PFADD key element [element ...]

向HyperLogLog数据结构添加一个或多个元素。每个元素会被添加到指定的HyperLogLog键中,用于更新基数估计。

PFCOUNT key [key ...]

返回给定一个或多个HyperLogLog键的基数估计值。这些键中的每个元素都会被计入,以提供一个总的近似基数计数。

PFMERGE destkey sourcekey [sourcekey ...]

将多个HyperLogLog数据结构合并到一个单一的HyperLogLog数据结构中,结果存储在destkey中。合并后的HyperLogLog提供了所有源HyperLogLog键中观察到的唯一元素的近似基数计数。

经典使用场景

  1. 网站UV统计:HyperLogLog非常适合用来统计网站的独立访客数量(UV)。由于其低内存消耗,它可以在不牺牲太多准确度的情况下,高效地处理大规模的用户访问数据
  2. 大型集合的基数估计:当需要对一个非常大的数据集进行基数估计时,使用HyperLogLog可以大大节省内存开销,同时保证误差在一个可接受的范围内
  3. 缓存穿透保护:对于缓存穿透问题,可以使用HyperLogLog记录已经查询过的数据标识符,快速判断请求是否重复,从而避免对数据库的无效查询

场景设计

应用场景:视频/直播间正在观看人数,允许误差和分钟级延迟
设计方案:结合HyperLogLog和过期时间的特性,能够有效地统计每分钟的观看人数

  • 缓存key为视频/直播间ID + 分钟级的时间戳
  • 当前在观看的每个客户端每分钟请求一次服务器(或心跳),统计至HyperLogLog
  • 查询观看人数时,查询上一分钟的HyperLogLog即可

由于HyperLogLog是一种基数估计算法,所以得到的观看人数是近似值,并不是精确的计数。在实际应用中,需要根据精确度要求和业务场景对结果进行合理的评估和调整

具体方案:

  1. 缓存键设计:将视频或直播间ID与分钟级时间戳结合作为缓存的键,可以确保每分钟的观看人数数据得到有效区分和存储。这样的设计可以方便地追踪特定视频或直播间在不同时间段内的观看人数。
  2. HyperLogLog数据结构:使用HyperLogLog作为观看人数的计数器是合适的选择。HyperLogLog可以在占用很小内存空间的情况下,对大量的唯一元素进行计数估计。由于每个客户端每分钟请求一次服务器并将用户或客户端ID添加到HyperLogLog中,可以粗略地估计每分钟的观看人数。
  3. 过期时间设置:将缓存数据的过期时间设置为几分钟,可以避免长期存储不再有效的数据,同时保持数据的实时性。过期时间的设置可以根据具体需求和业务场景来确定,确保及时清理不再需要的过期数据。
  4. 查询观看人数:使用PFCount命令可以获取每分钟的观看人数的近似值。通过对不同时间戳的HyperLogLog进行PFCount操作,可以得到每分钟的观看人数统计。

bitmap(位存储)

在Redis中,Bitmap是基于String类型实现的,可以高效地进行位操作,如设置位、获取位值、计算位的总数等

Bitmap(位图)是一种将每个元素映射到一个位上的数据结构,每个位只能表示0或1

命令

SETBIT key offset value:

设置或清除Redis字符串中的位。value可以是0或1,用于表示位的关闭或打开状态。

GETBIT key offset:

获取给定字符串键的位值。返回的是一个整数,表示指定偏移量上的位是0还是1。

BITCOUNT key [start end]:
```bash计算并返回字符串中位值为1的位的数量。可以通过指定start和end来限制计算的位范围。```bash
BITOP operation destkey key [key ...]:

对一个或多个BitMap进行位运算。operation可以是AND、OR、XOR或NOT,结果存储在destkey中

经典使用场景

  1. 签到打卡统计:可以使用Bitmap来记录用户每天的签到情况。每个用户对应一个Bitmap,每天对应一个位,签到则标记为1,未签到为0。这样可以高效地统计每月签到天数、连续签到情况等
  2. 活跃用户统计:通过记录用户每日的活跃状态,可以使用Bitmap来统计活跃用户数。每个用户对应一个位,活跃则标记为1,不活跃为0。这样可以快速统计出在一定时间范围内的活跃用户数量
  3. 实时数据分析:在需要实时分析大量二元数据的场景中,如股票市场中的买卖信号,可以使用Bitmap进行高效的数据记录和查询

geospatial (地理位置)

Geospatial(地理空间)是Redis用于处理地理位置相关数据的数据类型。它可以存储地理位置信息,并通过经纬度计算两个位置之间的距离,或者查询指定范围内的位置信息

命令

GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]:

向键key中添加一个或多个地理位置成员。NX和XX是可选标志,用于控制数据的添加行为,CH标志用于返回变化的计数。

GEOPOS key member [member ...]:

返回一个或多个成员的地理坐标。

GEODIST key member1 member2 [m|km|ft|mi]:

计算两个成员之间的距离,并返回结果。可以指定返回的距离单位。

GEOHASH key member [member ...]:

返回一个或多个成员的Geohash值。Geohash是一种对地理坐标进行编码的字符串,可以用来估计位置之间的距离。

GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [COUNT count [ANY]] [ASC|DESC]:

在指定范围内搜索成员,并按照与指定点之间的距离排序后返回。可以是圆形或矩形范围

经典使用场景

  1. 附近的人:Geospatial可以用来实现“附近的人”这类功能。通过记录用户的地理位置信息,可以查询某个地点周围的用户,或者推荐附近的服务和设施5。
  2. 路线规划:利用Geospatial可以计算两个地点之间的距离,这对于路线规划和导航类应用非常有用。例如,可以计算出从A点到B点的直线距离,或者规划出一条避开拥堵区域的路线
  3. 地理围栏:Geospatial可以用来创建地理围栏,监控进入或离开特定区域的对象,如车辆监控、人员定位等。
  4. 天气应用:在天气应用中,可以使用Geospatial来定位用户并提供相关的天气预报信息,如附近的雷暴警告或极端天气事件。
  5. 物流配送:物流行业可以利用Geospatial来优化配送路线,通过计算配送点之间的距离和位置信息,安排最高效的配送顺序和路径

参考资料:

  1. Redis入门 - 数据类型:3种特殊类型详解
  2. Redis:HyperLogLog使用与应用场景

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

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

相关文章

【Jenkins】Jenkins自动化工具介绍

目录 技术背景常规的手动打包步骤 Jenkins简介起源与发展Jenkins的核心价值1.自动化1.1代码构建1.2测试自动化1.3自动部署 2.持续集成与持续部署CI/CD的概念如何减少集成问题更快速地发布软件版本 Jenkins优势Jenkins的主要竞争对手Travis CI:CircleCI:GitLab CI: Jenkins与其他…

SpringBoot之集成Redis

SpringBoot之集成Redis 一、Redis集成简介二、集成步骤2.1 添加依赖2.2 添加配置2.3 项目中使用 三、工具类封装四、序列化 (正常都需要自定义序列化)五、分布式锁(一)RedisTemplate 去实现场景一:单体应用场景二&…

vim卡死了,没有反应怎么办?

解决办法: 很有可能是你有个在window下的好习惯,没事儿就ctrl s保存文件。但是在vim里,ctrl s默认是发送一种流控制信号,通常用于停止终端的输出,所以你的屏幕就卡死了。 解决办法也很简单,按下ctrl q即…

NJU PA0

NJU PA0 使用教程提供的源再进行sudo apt install … 可能会出现 Unmet dependencies 此类报错 可以安装 aptitude sudo apt install aptitude sudo aptitude install <package>然后它会提示你&#xff0c;选 n 进行降级。再选 Y 确认 或者 将 /etc/apt/sources.list 下…

一步一步写线程之八线程池的完善之三任务的封装

一、线程池中的任务 在前面的线程池操作中&#xff0c;任务只是通过std::function来实现。从实际的出发需求来说&#xff0c;基本上一般的线程任务使用其实已经够用。但在实际情况中&#xff0c;可能会遇到一些情况&#xff0c;比如不支持c11&#xff0c;或者为了某种目的无法…

【c++】优先级队列|反向迭代器(vector|list)

优先级队列的常用函数的使用 #include<iostream> #include<queue> using namespace std;int main() {priority_queue<int>st;st.push(1);st.push(7);st.push(5);st.push(2);st.push(3);st.push(9);while (!st.empty()){cout << st.top() << &qu…

UDP简单总结

UDP&#xff1a;用户数据报协议 特点: 无连接、不可靠通信 不事先建立连接&#xff0c;数据按照包发&#xff0c;一包数据包含&#xff1a;自己的IP、程序端口、目的地IP、程序端口和数据(限制在64KB内) 发送方不管对方是否在线&#xff0c;数据在中间丢失也不管&#xff0c;…

SpringBoot与MyBatisPlus的依赖版本冲突问题

记录使用SpringBoot和MyBatisPlus时遇到的版本冲突问题解决。 java版本&#xff1a;jdk17 废话&#xff1a;&#xff09;目前在IDEA中使用Spring官方的脚手架最低jdk版本竟然是jdk17了。 当使用SpringBoot3.0版本(3.2.4)&#xff0c;配合使用MP3.5.2版本时报错&#xff1a; Er…

对于所有对象都通用的方法⭐良好习惯总结

对于所有对象都通用的方法⭐良好习惯总结 Object是每个类的父类&#xff0c;它提供一些非final方法&#xff1a;equals、hashCode、clone、toString、finalize... 这些方法在设计上是可以被子类重写的&#xff0c;但是重写前需要遵守相关的规定&#xff0c;否则在使用时就可能…

应用实战|从头开始开发记账本2:基于模板快速开始

上期视频我们创建好了BaaS服务的后端应用。从这期视频开始&#xff0c;我们将从头开发一个互联网记账本应用。本期视频我们介绍一下如何使用模板快速开启我们的应用开发之旅。 应用实战&#xff5c;从头开始开发记账本2&#xff1a;基于模板快速开始 相关代码 本期视频我们介绍…

RestTemplate—微服务远程调用—案例解析

简介&#xff1a;总结来说&#xff0c;微服务之间的调用方式有多种&#xff0c;选择哪种方式取决于具体的业务需求、技术栈和架构设计。RESTful API和HTTP客户端是常见的选择&#xff0c;而Feign和Ribbon等辅助库可以简化调用过程。RPC和消息队列适用于特定的场景&#xff0c;如…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.4 月末操作:货币折算

2.6.4 月末操作&#xff1a;货币折算 如果一个公司代码启用了多个本位币&#xff0c;如下表所示&#xff0c;则在平时记账时&#xff0c;系统会在凭证行项目中同时体现出多个本位币的金额。 图2.6.4-1 两个本位币的金额都会实时更新到科目余额中。因此&#xff0c;在月末可以直…

pycharm2024关闭项目后一直显示正在关闭项目

网上的很多教程都试了不行&#xff0c;直接用下面的方法有效解决。 点击 帮助--查找操作--输入Registry--点注册表&#xff0c;取消ide.await.scope.completion后的勾选即可。

武汉星起航:跨境电商势头强劲,开启外贸增长新纪元

在全球化浪潮的推动下&#xff0c;跨境电商作为新兴贸易方式&#xff0c;正以前所未有的速度崛起。2024年前两个月&#xff0c;跨境电商进出口增长近10%&#xff0c;这一令人瞩目的数据&#xff0c;不仅彰显出跨境电商的强劲发展势头&#xff0c;更预示着其作为外贸新增长极的潜…

直接扩展到无限长,谷歌Infini-Transformer终结上下文长度之争

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 不知 Gemini 1.5 Pro 是否用到了这项技术。 谷歌又放大招了&#xff0c;发布下一代 Transfor…

2016NOIP普及组真题 1. 买铅笔

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1973 核心思想&#xff1a; 向上取整的代码 (m (n-1))/n 。&#xff08;本题考点与2023年J组的第一和第二题一样&#xff09; 比如需要买31支笔&#xff0c;每包30支&#xff0c;则需要…

突破像素限制,尽显照片细腻之美——Topaz Gigapixel AI for Mac/Win

在这个数字化的时代&#xff0c;我们都热爱用照片记录生活中的美好瞬间。然而&#xff0c;有时候我们会发现&#xff0c;由于各种原因&#xff0c;照片的像素可能无法满足我们的需求。这时候&#xff0c;Topaz Gigapixel AI for Mac/Win 这款强大的照片放大工具应运而生。 Top…

代码开发常见模块引入顺序规范

第一组&#xff1a;第三方库或框架 React 相关模块第三方库或框架&#xff08;例如&#xff1a;antd&#xff09; 第二组&#xff1a;自己的库或模块 自己的库或模块&#xff08;例如&#xff1a;jszone/abc、jszone/bcd&#xff09; 第三组&#xff1a;具体功能或业务相关…

联储降息预期落空打了谁的脸

美国 3 月消费者价格指数&#xff08;CPI&#xff09;于本周发布&#xff0c;最新数据全线高于预期。具体而言&#xff0c;美国劳工部周三公布的数据显示&#xff0c;美国 3 月消费者物价指数&#xff08;CPI&#xff09;同比上涨 3.5%&#xff0c;为 2023 年 9 月以来最高水平…

华为OD-C卷-分割均衡字符串[100分]

题目描述 均衡串定义&#xff1a;字符串中只包含两种字符&#xff0c;且这两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定&#xff1a;字符串中只包含大写的 X 和 Y 两种字符。 输入描述 输入一个均衡串。 字符串的长…