新数据类型
Bitmaps
1、不是一种数据类型, 实际上是字符串(key-value),但可以对字符串的位进行操作
2、Bitmaps 单独提供一套命令,所以在 Redis 中使用 Bitmaps,和使用字符串的方法不太相同
3、可以把 Bitmaps 类比为一个以 bit 为单位的数组
(1)数组的每个单元只能存储 0 和 1
(2)数组的下标在 Bitmaps 中叫做偏移量
4、设置或者清空 key 的 value(字符串)在 offset 处的 bit 值
SETBIT key offset value
(1)指定位置的 bit 要么被设置,要么被清空,这个由 value(只能是 0 或 1)来决定
(2)当 key 不存在时,就创建一个新的字符串 value,要确保这个字符串大到在 offset 处有 bit 值
(3)offset 需要大于等于 0,并且小于 232(限制 bitmap 大小为 512)
(4)当 key 对应的字符串增大时,新增的部分 bit 值都是设置为 0
(5)当 set 最后一个 bit(offset = 232 - 1),并且 key 还没有一个字符串 value,或者其 value 是个比较小的字符串时,Redis 需要立即分配所有内存,这有可能会导致服务阻塞一会
(6)一旦第一次内存分配完,后面对同一个 key,调用 SETBIT 就不会预先得到内存分配
(7)返回在 offset 处原来 bit 值
5、返回 key 对应 string 在 offset 处的 bit 值
GETBIT key offset
(1)当 offset 超出字符串长度时,这个字符串就被假定为由 0 比特填充的连续空间
(2)当 key 不存在时,它就认为是一个空字符串,所以 offset 总是超出范围,然后 value 也被认为是由0比特填充的连续空间。到内存分配。
6、统计字符串被设置为 1 的 bit 个数
BITCOUNT key [start end]
(1)一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行
(2)start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,-2 表示倒数第二个位,以此类推
(3)不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0
7、对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上
BITOP operation destkey key [key ...]
(1)BITOP 命令支持 AND、OR、NOT、XOR 这四种操作中的任意一种参数
(2)BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN ,对一个或多个 key 求逻辑并,并将结果保存到 destkey
(3)BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN,对一个或多个 key 求逻辑或,并将结果保存到 destkey
(4)BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
(5)BITOP NOT destkey srckey,对给定 key 求逻辑非,并将结果保存到 destkey
(6)除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入
(7)执行结果将始终保持到 destkey 中
(8)当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
(9)空的 key 也被看作是包含 0 的字符串序列
(10)返回保存到 destkey 的字符串的长度,和输入 key 中最长的字符串长度相等
HyperLogLog
1、基数问题:求集合中不重复元素个数
2、解决基数问题
(1)数据存储在 MySQL 表中,使用 distinct count 计算不重复个数
(2)使用 Redis 提供的 hash、set、bitmaps 等数据结构来处理
(3)以上方案结果精确,但随着数据不断增加,导致占用空间越来越大
3、基数统计的算法
4、优点
(1)在输入元素的数量,或体积非常非常大时,计算基数所需的空间总是固定的、并且很小
(2)在 Redis 中,每个 HyperLogLog 键只需要花费 12KB 内存,就可以计算接近 264 个不同元素的基数
5、缺点
(1)降低一定精度来平衡存储空间
(2)HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素
6、基数估计就是在误差可接受的范围内,快速计算基数
7、将除了第一个参数以外的参数,存储到以第一个参数为变量名的 HyperLogLog 结构中
PFADD key element [element ...]
(1)这个命令的一个副作用,可能会更改这个 HyperLogLog 的内部,来反映在每添加一个唯一的对象时估计的基数(集合的基数)
(2)如果一个 HyperLogLog 的估计的近似基数,在执行命令过程中发了变化,PFADD 返回 1,否则返回 0
(3)如果指定 key 不存在,这个命令会自动创建一个空的 HyperLogLog 结构(指定长度和编码的字符串)
(4)如果在调用该命令时,允许仅提供变量名而不指定元素,如果这个变量名存在,则不会有任何操作,如果不存在,则会创建一个数据结构,返回 1
(5)如果 HyperLogLog 的内部被修改,那么返回 1,否则返回 0
8、返回 PFADD 添加的唯一元素的近似数量
PFCOUNT key [key ...]
(1)当参数为一个 key 时,返回存储在 HyperLogLog 结构体的该变量的近似基数,如果该变量不存在,则返回 0
(2)当参数为多个 key 时,返回这些 HyperLogLog 并集的近似基数,这个值是将所给定的所有 key 的 HyperLoglog 结构,合并到一个临时的 HyperLogLog 结构中计算而得到的
(3)HyperLogLog 可以使用固定且很少的内存(每个 HyperLogLog 结构需要 12 KB 再加上 key 本身的字节)来存储集合的唯一元素
(4)返回的可见集合基数并不是精确值,而是一个带有 0.81% 标准错误(standard error)的近似值
(5)这个命令的一个副作用,可能会导致 HyperLogLog 内部被更改,出于缓存的目的,它会用 8 字节来记录最近一次计算得到基数,所以 PFCOUNT 命令在技术上是个写命令
9、将多个 HyperLogLog 合并(merge)为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]
(1)合并后的 HyperLogLog 的基数,接近于所有输入 HyperLogLog 的可见集合(observed set)的并集
(2)合并得出的 HyperLogLog 会被储存在目标变量(第一个参数)中,如果该键并不存在,那么命令在执行之前, 会先为该键创建一个空的 HyperLogLog 结构
(3)只会返回 OK
Geospatial
1、Redis 3.2 中增加对 GEO 类型的支持
(1)GEO:Geographic
(2)元素的二维坐标,在地图上就是经纬度
(3)Redis 基于该类型,提供经纬度设置,查询,范围查询,距离查询,经纬度 Hash 等常见操作
2、将指定的地理空间位置(纬度、经度、名称)添加到指定的 key 中
GEOADD key longitude latitude member [longitude latitude member ...]
(1)这些数据将会存储到 sorted set,为了方便使用 GEORADIUS 或 GEORADIUSBYMEMBER 命令,对数据进行半径查询等操作
(2)返回添加到 sorted set 元素的数目,但不包括已更新 score 的元素
3、从 key 里返回所有给定位置元素的位置(经度和纬度)
GEOPOS key member [member ...]
(1)返回一个数组,数组中的每个项都由两个元素组成:第一个元素为给定位置元素的经度,而第二个元素则为给定位置元素的纬度
(2)当给定的位置元素不存在时,对应的数组项为空值
4、返回两个给定位置之间的距离
GEODIST key member1 member2 [unit]
(1)如果两个位置之间的其中一个不存在,那么命令返回空值
(2)指定单位的参数 unit 必须是以下单位的其中一个
(3)m:表示单位为米
(4)km:表示单位为千米
(5)mi:表示单位为英里
(6)ft:表示单位为英尺
(7)如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位
(8)GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差
(9)计算出的距离会以双精度浮点数的形式被返回
(10)如果给定的位置元素不存在, 那么命令返回空值
5、以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
(1)范围可以使用以下其中一个单位
(2)m:表示单位为米
(3)km:表示单位为千米
(4)mi:表示单位为英里
(5)ft:表示单位为英尺
(6)在给定以下可选项时, 命令会返回额外的信息
(7)WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致
(8)WITHCOORD:将位置元素的经度和维度也一并返回
(9)WITHHASH:以 52 位有符号整数的形式,返回位置元素经过原始 geohash 编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大
(10)默认返回未排序的位置元素
(11)通过以下两个参数,用户可以指定被返回位置元素的排序方式
(12)ASC:根据中心的位置, 按照从近到远的方式返回位置元素
(13)DESC:根据中心的位置, 按照从远到近的方式返回位置元素
(14)默认情况下,GEORADIUS 命令会返回所有匹配的位置元素
(15)用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素,但是因为命令在内部可能会需要对所有被匹配的元素进行处理,所以在对一个非常大的区域进行搜索时,即使只使用 COUNT 选项去获取少量元素,命令的执行速度也可能会非常慢。但是从另一方面来说,使用 COUNT 选项去减少需要返回的元素数量,对于减少带宽来说仍然是非常有用的
(16)在没有给定任何 WITH 选项的情况下,命令只会返回一个线性(linear)列表
(17)在指定 WITHCOORD、WITHDIST、WITHHASH 等选项的情况下,命令返回一个二维数组,内层的每个子数组就表示一个元素,子数组的第一个元素总是位置元素的名字
(18)额外信息会作为子数组的后续元素,按照以下顺序被返回
(19)以浮点数格式返回的中心与位置元素之间的距离,单位与用户指定范围时的单位一致
(20)geohash 整数
(21)由两个元素组成的坐标,分别为经度和纬度
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战