redis6 新数据类型 Bitmaps,HyperLogLog,Geospatial


redis6 新数据类型 Bitmaps,HyperLogLog,Geospatial

1.Bitmaps

(1)Bitmaps并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M。

(2)Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。

3073170888b1b94f8805c7036924009d.png

命令

setbit

实例 

每个独立用户是否访问过网站放在Bitmaps中,将访问的用户记为1,没有访问的用户记为0,用户偏移量作为用户id。

setbit \ \ \

设置键的第offset个位的值(从0算起) , 假设现在有20个用户,userid=1, 6, 11, 16, 19的用户对网站进行了访问, 那么当前Bitmaps初始化结果如图所示。

11abeb9c7d31764a59fb7740475e1537.png

unique:users:202100101 代表2021-01-01这天的独立访问用户的Bitmaps:

c025f42db37439af46f961e6569de3d0.png

getbit

getbit \ \ \  获取bitmap中某个偏移量的值

实例

5c51112536fd2b96174dc58fcf185988.png

bitcount

bitcount \ [start end]   统计字符串从start字节到end字节比特值为1的数量

2115c236863c22c4ab599f51fef4ad1e.png

374eb6ab007405885c203c4bc2385d07.png

bitop

bitop and(or/not/xor) \ [key…]

bitop 是一个复合操作,它可以 做多个Bitmap的  and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destkey中。

实例:

2021-11-04日访问网站的userid=1,2,5,9

127.0.0.1:6379> setbit unique:user:20211104 1 1
(integer) 0
127.0.0.1:6379> setbit unique:user:20211104 2 1
(integer) 0
127.0.0.1:6379> setbit unique:user:20211104 5 1
(integer) 0
127.0.0.1:6379> setbit unique:user:20211104 9 1
(integer) 0
127.0.0.1:6379>  

 2021-11-03日访问网站的userid=0,1,4,9

127.0.0.1:6379> setbit unique:user:20211103 0 1
(integer) 0
127.0.0.1:6379> setbit unique:user:20211103 1 1
(integer) 0
127.0.0.1:6379> setbit unique:user:20211103 4 1
(integer) 0
127.0.0.1:6379> setbit unique:user:20211103 9 1
(integer) 0
127.0.0.1:6379>

计算两天都访问过网站的用户数量

127.0.0.1:6379> bitop and unique:user:20211104_03 unique:user:20211103  unique:user:20211104

f9e80c20f88815d8e5e8f3df5b2f65e3.png

2.HyperLogLog

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?

比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5。基数估计就是在误差可接受范围内快速计算基数

命令

pfadd

pfadd \ \ [element…]      添加指定元素到HyperLogLog中

将所有元素添加到指定的HyperLogLog中。如果执行命令后HLL估计的近似基数发生变化,则返回1,否则返回0

127.0.0.1:6379> pfadd program "java"
(integer) 1
127.0.0.1:6379> pfadd program "php"
(integer) 1
127.0.0.1:6379> pfadd program "java"
(integer) 0
127.0.0.1:6379> pfadd program "c++" "c"
(integer) 1

pfcount

pfcount \ [key…] 计算HLL的近似基数,可以计算多个HLL,比如用HLL存储每天的UV

127.0.0.1:6379> pfcount program
(integer) 4

pfmerge

pfmerge \ \ [sourcekey …] 将一个或多个HLL合并后的结果存储在另一个HLL,比如每月活跃用户可以使用每天活跃用户来合并计算可得

127.0.0.1:6379> pfadd k1 "a" "b" "c"
(integer) 1
127.0.0.1:6379> pfcount k1
(integer) 3
127.0.0.1:6379> pfadd k2 "c" "d" "e" "f"
(integer) 1
127.0.0.1:6379> pfadd k3 "g" "h" "h"
(integer) 1
127.0.0.1:6379> pfcount k2
(integer) 4
127.0.0.1:6379> pfcount k3
(integer) 2
127.0.0.1:6379> pfmerge k1_k2_k3 k1 k2 k3
OK
127.0.0.1:6379> pfcount k1_k2_k3
(integer) 8
127.0.0.1:6379>

3.Geospatial

Redis3.2中增加了对GEO类型的支持。GEO,Geographic,地理信息的缩写。

该类型,就是元素的2维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬

度设置,查询,范围查询,距离查询,经纬度Hash等常见操作.

geoadd 添加地理坐标

127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38  38.90 beijing
(integer) 3

geopos 获得指定地区的坐标值

127.0.0.1:6379> geopos china:city shanghai
1) 1) "121.47000163793563843"
   2) "31.22999903975783553"
127.0.0.1:6379> geopos china:city shenzhen chongqing
1) 1) "114.04999762773513794"
   2) "22.5200000879503861"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"

geodist 获取两个位置之间的直线距离

127.0.0.1:6379> geodist china:city shanghai beijing km
"970.3997"
127.0.0.1:6379> geodist china:city shanghai beijing m
"970399.6506"
127.0.0.1:6379> geodist china:city shanghai beijing ft
"3183725.8880"
127.0.0.1:6379> geodist china:city shanghai beijing mi
"602.9799"

单位:

m表示单位为米[默认值]。

km表示单位为千米。

mi表示单位为英里。

ft表示单位为英尺。

如果用户没有显示的指定参数,那么geodist默认使用米作为单位

georadius 以给定的经纬度为中心,找出某一半径内的元素

127.0.0.1:6379> georadius china:city 110 30 1000 km
1) "chongqing"
2) "shenzhen"
127.0.0.1:6379>

Author: qwq小小舒
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source qwq小小舒 !
  TOC