Redis学习【6】之BitMap、HyperLogLog、Geospatial操作命令 (1)

news2024/11/17 16:33:43

文章目录

  • 前言
  • BitMap 操作命令
    • 1.1 BitMap 简介
    • 1.2 setbit
    • 1.3 getbit
    • 1.4 bitcount
    • 1.5 bitpos[pos:position]
    • 1.6 bitop
    • 1.7 应用场景
  • 二 HyperLogLog 操作命令
    • 2.1 HyperLogLog 简介
    • 2.2 pfadd
    • 2.3 pfcount
    • 2.4 pfmerge
    • 2.5 应用场景
  • 三 Geospatial【地理空间】操作命令
    • 3. 1 Geospatial 简介
    • 3.2 geoadd
    • 3.3 geopos
    • 3.4 geodist
    • 3.5 geohash
    • 3.6 georadius
    • 3.7 georadiusbymember
    • 3.8 应用场景

前言

  • 学习的内容来源于网络,仅有用于学习和复习,希望可以跟大家共同一起开发

BitMap 操作命令

1.1 BitMap 简介

  • BitMap 是 Redis 2.2.0 版本中引入的一种新的数据类型。
  • BitMap本质上就是一个仅包含 0 和 1 的二进制字符串。而其所有相关命令都是对这个字符串二进制位的操作。用于描述该字符串的属性有三个:key、offset、bitValue。
属性说明
keyBitMap 是 Redis 的 key-value 中的一种 Value 的数据类型,所以该 Value 一定有其对应的 key。
offset每个 BitMap 数据都是一个字符串,字符串中的每个字符都有其对应的索引,该索引从 0 开始。
索引就称为每个字符在该 BitMap中的偏移量 offset
这个 offset的值的范围是 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [02321],即该 offset 的最大值为 4 G − 1 4G-1 4G1,即 4294967295 4294967295 4294967295,42 亿多。
bitValue每个 BitMap 数据中都是一个仅包含 0 和 1 的二进制字符串,每个 offset 位上的字符就称为该位的值 bitValue。【bitValue 的值非 0 即 1。】

1.2 setbit

命令说明
格式SETBIT key offset value
功能为给定 keyBitMap 数据的 offset 位置设置值为 value,其返回值为修改前该 offset位置的 bitValue
说明对于原 BitMap 字符串中不存在的 offset 进行赋值,字符串会自动伸展以确保它可以将 value 保存在指定的 offset 上。当字符串值进行伸展时,空白位置以 0 填充。
  • 需要注意的是,对使用较大 offset 的 SETBIT 操作来说,内存分配过程可能造成 Redis 服务器被阻塞。
    在这里插入图片描述

1.3 getbit

命令说明
格式GETBIT key offset
功能key 所储存的 BitMap 字符串值,获取指定 offset 偏移量上的位值 bitValue
说明当 offset 比字符串值的长度大,或者 key 不存在时,返回 0 。

在这里插入图片描述

1.4 bitcount

命令说明
格式BITCOUNT key [start] [end]
功能统计给定字符串中被设置为 1 的 bit 位的数量。一般情况下,统计的范围是给定的整个 BitMap 字符串,也可以通过指定额外的 start 或 end 参数,实现仅对指定字节范围内字符串进行统计【包含两端的闭区间】。
注意:start 与 end 的单位是字节,不是 bit,并且从 0 开始计数。
说明start 和 end 参数都可以使用负数值: -1 表示最后一个字节, -2 表示倒数第二个字节,以此类推。【对于不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。】

在这里插入图片描述

1.5 bitpos[pos:position]

  • 格式:BITPOS key bit [start] [end]
  • 功能:返回 key 指定的 BitMap 中第一个值为指定值 bit(非 0 即 1) 的二进制位的位置。在默认情况下, 命令将检测整个 BitMap,但用户也可以通过可选的 start 参数和 end 参数指定要检测的范围。
  • 说明:start 与 end 的意义与 bitcount 命令中的相同。
    在这里插入图片描述

1.6 bitop

  • 格式:BITOP operation destkey key *key …+
  • 功能:对一个或多个 BitMap 字符串 key 进行二进制位操作,并将结果保存到 destkey 上。
  • operation 可以是 A N D 、 O R 、 N O T 、 X O R AND 、 OR 、 NOT 、 XOR ANDORNOTXOR 这四种操作中的任意一种:
    • BITOP AND destkey key [key ...] :对一个或多个 BitMap 执行按位与操作,并将结果保存到 destkey 。
    • BITOP OR destkey key [key ...] :对一个或多个 BitMap 执行按位或操作,并将结果保存到 destkey 。
    • BITOP XOR destkey key [key ...] :对一个或多个 BitMap 执行按位异或操作,并将结果保存到 destkey 。
    • BITOP NOT destkey key :对给定 BitMap 执行按位非操作,并将结果保存到 destkey 。
  • 说明:
    • 除了 NOT 操作之外,其他操作都可以接受一个或多个 BitMap 作为输入。
    • 除了 NOT 操作外,其他对一个 BitMap 的操作其实就是一个复制。
    • 如果参与运算的多个 BitMap 长度不同,较短的 BitMap 会以 0 作为补充位与较长BitMap 运算,且运算结果长度与较长 BitMap 的相同。

1.7 应用场景

  • offset 的取值范围很大,所以其一般应用于大数据量的二值性统计。例如平台活跃用户统计(二值:访问或未访问)、支持率统计(二值:支持或不支持)、员工考勤统计(二值:上班或未上班)、图像二值化(二值:黑或白)等。
    • 不过,对于数据量较小的二值性统计并不适合 BitMap,可能使用 Set 更为合适。当然,具体多少数据量适合使用 Set,超过多少数据量适合使用 BitMap,这需要根据具体场景进行具体分析。
    • 例如,一个平台要统计日活跃用户数量。
      • 如果使用 Set 来统计,只需上线一个用户,就将其用户 ID 写入 Set 集合即可,最后只需统计出 Set 集合中的元素个数即可完成统计。即 Set 集合占用内存的大小与上线用户数量成正比。假设用户 ID 为 m 位 bit 位,当前活跃用户数量为 n,则该 Set 集合的大小最少应该是m*n 字节。
      • 如果使用 BitMap 来统计,则需要先定义出一个 BitMap,其占有的 bit 位至少为注册用户数量。只需上线一个用户,就立即使其中一个 bit 位置 1,最后只需统计出 BitMap 中 1 的个数即可完成统计。即 BitMap 占用内存的大小与注册用户数量成正比,与上线用户数量无关。假设平台具有注册用户数量为 N,则 BitMap 的长度至少为 N 个 bit 位,即 N/8 字节。何时使用 BitMap 更合适?令 mn 字节 = N/8 字节,即 n = N/8/m = N/(8m) 时,使用Set 集合与使用 BitMap 所占内存大小相同。以淘宝为例,其用户 ID 长度为 11 位(m),其注册用户数量为 8 亿(N),当活跃用户数量为 8 亿 / ( 8 ∗ 11 ) = 0.09 亿 = 9 ∗ 106 = 900 万 8 亿/(8*11) = 0.09 亿 = 9*106= 900 万 8亿/(811)=0.09亿=9106=900,使用 Set与 BitMap 占用的内存是相等的。但淘宝的日均活跃用户数量为 8 千万,所以淘宝使用 BitMap更合适。

二 HyperLogLog 操作命令

2.1 HyperLogLog 简介

  • HyperLogLog 是 Redis 2.8.9 版本中引入的一种新的数据类型,其意义是 hyperlog log,超级日志记录。该数据类型可以简单理解为一个 set 集合,集合元素为字符串。但实际上HyperLogLog 是一种基数计数概率算法,通过该算法可以利用极小的内存完成独立总数的统计。其所有相关命令都是对这个“set 集合”的操作。
  • HyperLogLog 算法是由法国人 Philippe Flajolet 博士研究出来的,Redis的作者 Antirez 为了纪念 Philippe Flajolet 博士对组合数学和基数计算算法分析的研究,在设计 HyperLogLog 命令的时候使用了 Philippe Flajolet姓名的英文首字母 PF 作为前缀。

2.2 pfadd

  • 格式:PFADD key element *element …+
  • 功能:将任意数量的元素添加到指定的 HyperLogLog 集合里面。如果内部存储被修改了返回 1,否则返回 0。

2.3 pfcount

格式:PFCOUNT key *key …+

  • 功能:该命令作用于单个 key 时,返回给定 key 的 HyperLogLog 集合的近似基数;该命令作用于多个 key 时,返回所有给定 key 的 HyperLogLog 集合的并集的近似基数;如果key 不存在,则返回 0。

2.4 pfmerge

  • 格式:PFMERGE destkey sourcekey *sourcekey …+
  • 功能:将多个 HyperLogLog 集合合并为一个 HyperLogLog 集合,并存储到 destkey 中,
    合并后的 HyperLogLog 的基数接近于所有 sourcekey 的 HyperLogLog 集合的并集。

2.5 应用场景

  • HyperLogLog 可对数据量超级庞大的日志数据做不精确的去重计数统计。当然,这个不精确的度在 Redis 官方给出的误差是 0.81%。这个误差对于大多数超大数据量场景是被允许的。对于平台上每个页面每天的 UV 数据,非常适合使用 HyperLogLog 进行记录。

三 Geospatial【地理空间】操作命令

3. 1 Geospatial 简介

  • Redis 在 3.2 版本中引入了 Geospatial 这种新的数据类型。
  • 该类型本质上仍是一种集合,只不过集合元素比较特殊,是一种由三部分构成的数据结构,这种数据结构称为空间元素:
    • 经度:longitude——有效经度为[-180,180]。正的表示东经,负的表示西经。
    • 纬度:latitude——有效纬度为[-85.05112878,85.05112878]。正的表示北纬,负的表示南纬。
    • 位置名称:Geospatial 集合的空间元素名称。
  • 通过该类型可以设置、查询某地理位置的经纬度,查询某范围内的空间元素,计算两空间元素间的距离等

3.2 geoadd

  • 格式:GEOADD key longitude latitude member *longitude latitude member …+
  • 功能:将一到多个空间元素添加到指定的空间集合中。
  • 说明:当用户尝试输入一个超出范围的经度或者纬度时,该命令会返回一个错误。

3.3 geopos

  • 格式:GEOPOS key member *member …+
  • 功能:从指定的地理空间中返回指定元素的位置,即经纬度。
  • 说明:因为 该命令接受可变数量元素作为输入,所以即使用户只给定了一个元素,命令也会返回数组。

3.4 geodist

  • 格式:GEODIST key member1 member2 [unit]
  • 功能:返回两个给定位置之间的距离。其中 unit 必须是以下单位中的一种:
  • m :米,默认
  • km :千米
  • mi :英里
  • ft:英尺
  • 说明:如果两个位置之间的其中一个不存在, 那么命令返回空值。另外,在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

3.5 geohash

  • 格式:GEOHASH key member *member …+
  • 功能:返回一个或多个位置元素的 Geohash 值。
  • 说明:GeoHash 是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串。该值主要用于底层应用或者调试, 实际中的作用并不大。

3.6 georadius

  • 格式:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST]
    [WITHHASH] [ASC|DESC] [COUNT count]
  • 功能:以给定的经纬度为中心,返回指定地理空间中包含的所有位置元素中,与中心距离不超过给定半径的元素。返回时还可携带额外的信息:
  • WITHDIST :在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。
  • WITHCOORD :将位置元素的经维度也一并返回。
  • WITHHASH:将位置元素的 Geohash 也一并返回,不过这个 hash 以整数形式表示命令默认返回未排序的位置元素。 通过以下两个参数,用户可以指定被返回位置元素的排序方式:
  • ASC :根据中心的位置,按照从近到远的方式返回位置元素。
  • DESC :根据中心的位置,按照从远到近的方式返回位置元素。
  • 说明:在默认情况下, 该命令会返回所有匹配的位置元素。虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素,但因为命令在内部可能会需要对所有被匹配的元素进行处理,所以在对一个非常大的区域进行搜索时,即使使用 COUNT 选项去获取少量元素,该命令的执行速度也可能会非常慢。

3.7 georadiusbymember

  • 格式:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
  • 功能:这个命令和 GEORADIUS 命令一样,都可以找出位于指定范围内的元素,但该命令的中心点是由位置元素形式给定的,而不是像 GEORADIUS 那样,使用输入的经纬度来指定中心点。
  • 说明:返回结果中也是包含中心点位置元素的

3.8 应用场景

  • Geospatial ——地理位置,所以其主要应用地理位置相关的计算。例如,微信发现中的“附近”功能,添加朋友中“雷达加朋友”功能;QQ 动态中的“附近”功能;钉钉中的“签到”功能等

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

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

相关文章

Zynq非VDMA方案实现视频3帧缓存输出,无需SDK配置,提供工程源码和技术支持

目录1、前言2、VDMA的不便之处3、FDMA取代VDMA实现视频缓存输出4、Vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 对于Zynq和Microblaze的用户而言&#xff0c;要想实现图像缓存输出&#xff0c;多半要使用Xilinx推荐的VDMA方案&#xff0c;该…

【Ubuntu版】VScode配置Python开发环境

一、相关介绍 1. 快捷键 快捷键解释说明ctrlp全文搜索文件 二、VSCode连接远程服务器开发 1. 安装remote插件 2. 安装Python插件 3. config配置 Host myServerHostName 172.x.x.xUser rootPort 6005参数解释 Host&#xff0c;自定义名称&#xff1b;HostName&#xff0c;远…

Kafka使用规范(纯技术和实战建议)

概述&#xff1a; 1、kafka使用规范主要从&#xff0c;生产、可靠性、和消费为轴线定义使用规范&#xff0c;另外Kafka建议核心业务系统不要使用&#xff08;对数据可靠性要求高&#xff09;&#xff0c;因为Kafka高效性能源于批量设计思想&#xff0c;要充分利于Kafka高效性能…

【Python小游戏】智商爆棚,推荐一款益智类亲子娱乐首选—某程序员老爸:成语编成填空“游戏”,贪玩女儿1天牢记500词(厉害了我的Python)

前言 成语填空想必大家都是十分熟悉的了&#xff0c;特别是有在上小学的家长肯定都有十分深刻的印象。 在我们的认知里看图猜成语不就是一些小儿科的东西吗&#xff1f; 当然了你也别小看了成语调控小游戏&#xff0c;有的时候知识储备不够&#xff0c;你还真的不一定猜得出…

嵌入式STM32F767BGT6规格STM32F767BIT6引脚图 32Bit MCU+FPU

ARM Cortex-M7 STM32 F7 Microcontroller IC 32-Bit 216MHz 1MB (1M x 8) FLASH 208-LQFP (28x28)产品信息型号&#xff1a;STM32F767BGT6 / STM32F767BIT6类型&#xff1a;ARM微控制器 - MCU封装&#xff1a;LQFP-208明佳达电子下面是产品中文规格&#xff0c;仅供参考&#x…

云帆文档易用性功能设计之文档查阅

云帆文档管理系统是一款基于 SpringBootVue 开发的电子文档管理系统。系统集成了用户管理、角色管理、部门管理、文档管理、新闻管理、问答管理、通告管理、文档全文检索。 支持常用的 office 文档&#xff0c;视频文件、PDF 文档在线预览&#xff0c;下载&#xff0c;笔记&…

ChatGPT中文免费小程序(AI GPGT智能助手) - ChatGPT国内小程序版在线使用

ChatGPT中文网是一个面向中国用户的聊天机器人网站&#xff0c;旨在为国内用户提供一个自然的环境、有趣、实用的聊天体验。它使用最新的自然语言处理技术来帮助用户更好地理解他们的聊天对话&#xff0c;还可以帮助用户解决日常生活中的问题&#xff0c;提供有趣的谈话内容以及…

最新版EasyRecovery数据恢复软件使用测评介绍

我们在逐渐适应信息电子化的同时&#xff0c;也有一些潜在的麻烦接踵而来&#xff0c;其中较为常见的就是文件和数据的保存问题。显然&#xff0c;设备的存储空间是有限的&#xff0c;这就不可避免地会出现数据被删除、覆盖或丢失的现象&#xff0c;如果丢失的是重要数据&#…

【MyBatis】源码学习 01 - 泛型解析器 TypeParameterResolver

文章目录前言参考目录问题引入流程分析TypeParameterResolver#resolveReturnTypeTypeParameterResolver#resolveTypeTypeParameterResolver#resolveParameterizedTypeTypeParameterResolver#resolveTypeVar前言 最近结合着源码书学习 MyBatis&#xff0c;毫不夸张的说&#xf…

Kubernetes基本概念与组件

Kubernetes基本概念与组件 基本概念 Kubernetes 中的绝大部分概念都抽象成 Kubernetes 管理的一种资源对象&#xff0c;下面我们一起学习一下常遇到的一些资源对象&#xff1a; Master&#xff1a;Master 节点是 Kubernetes 集群的控制节点&#xff0c;负责整个集群的管理和控…

Camera | 4.瑞芯微平台MIPI摄像头应用程序编写

前面3篇我们讲解了camera的基础概念&#xff0c;MIPI协议&#xff0c;CSI2&#xff0c;常用命令等&#xff0c;本文带领大家入门&#xff0c;如何用c语言编写应用程序来操作摄像头。 Linux下摄像头驱动都是基于v4l2架构&#xff0c;要基于该架构编写摄像头的应用程序&#xff…

Java 反射深入浅出

Java 反射深入浅出&#x1f4c8; 反射的概述&#xff1a;&#x1f4d1; Java Reflection(反射) 被视为动态语言的关键&#xff0c;Java并不是动态语言&#xff0c;但因为反射Java可以被称为准动态语言 反射机制允许程序在执行期 借助于Reflection API取得任何类的内部信息&a…

哪款蓝牙耳机性价比最高?无线蓝牙耳机性价比排行榜

我酷爱音乐&#xff0c;也是游戏发烧友&#xff0c;平时耳机从不离身。用的耳机多了&#xff0c;在选择上也有了自己的一些心得&#xff0c;通常来说&#xff0c;音乐耳机注重音效&#xff0c;游戏耳机注重低延迟&#xff0c;当前蓝牙耳机市场琳琅满目&#xff0c;下面推荐以下…

100M网口客户电脑插上网线就断线,自己工厂正常,是什么问题导致?

Hqst&#xff08;华强盛科技&#xff09;导读&#xff1a;物联工程师100M网口产品出现客户电脑插上网线就显示断线&#xff0c;无法通信&#xff0c;在自己工厂又正常使用&#xff0c;是什么问题&#xff1f;问&#xff1a;100M 网口&#xff0c; 使用改电路&#xff0c; 产品出…

Learning C++ No.10【STL No.2】

引言&#xff1a; 北京时间&#xff1a;2023/2/14/23:18&#xff0c;放假两个月&#xff0c;没有锻炼&#xff0c;今天去跑了几圈&#xff0c;一个字&#xff0c;累&#xff0c;感觉人都要原地升天了&#xff0c;所以各位小伙伴&#xff0c;准确的说是各位卷王&#xff0c;一定…

与其被行业内卷,还不如主动出击,打破困境~

如今的 “互联行业内卷”这事好像成为了一种常态&#xff0c;尤其是在一些已处于饱和状态和即将处于饱和状态的行业比较突出&#xff0c;比如&#xff1a;Android 开发行业、前端、……等等 造成行业内卷原因是什么&#xff1f; 市场竞争加剧&#xff0c;企业更加注重成本控制…

大数据---Hadoop集群搭建

Hadoop集群搭建 再起启动一台虚拟机并且安装jdk&#xff0c;开启免密登录 不需要安装zookeeper 文章目录Hadoop集群搭建时间同步4台机器安装npdate设置定时任务集群配置图将Hadoop安装包上传到zk1zk1---解压到soft目录下zk1---更名zk1---修改配置文件core-site.xmlhdfs-site.x…

第四届宁波网安市赛训练题

Crypto 散乱的密文 8fd4a4c94gf15{50}l72d3提示了2 1 6 5 3 4&#xff0c;我们直接横向排列 2165348fd4a4c94gf15{50}l72d3 按顺序竖着抄下来fc1l84f}a45dg034{2d957,然后栅栏解密&#xff0c;注意这里是W型栅栏解密&#xff0c;行数6 flag:flag{52048c453d794df1} 综合解密…

stm32f429FMC外设学习

功能框图 这是一种型号为 W9825G6KH 的 SDRAM 芯片内部结构框图&#xff0c;以它为模型进行学习 CLK -- FMC_SDCLK //同步时钟信号 CKE -- FMC_SDCKE[1:0] //SDCKE0&#xff1a; SDRAM 存储区域 1 时钟使能,;SDCKE1&#xff1a; SDRAM 存储区域 2 时钟使能.这里表示的…

QT(16)- QFileDevice

QT&#xff08;16&#xff09;- QFileDevice1 简介2 公有类型2.1 enum QFileDevice::FileError2.2 enum QFileDevice&#xff1a;&#xff1a;FileHandleFlag2.3 enum QFileDevice::FileTime2.4 enum QFileDevice&#xff1a;&#xff1a;MemoryMapFlags2.5 enum QFileDevice::…