redis6 新数据类型 Bitmaps,HyperLogLog,Geospatial
1.Bitmaps
(1)Bitmaps并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M。
(2)Bitmaps单独提供了一套命令, 所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组, 数组的每个单元只能存储0和1, 数组的下标在Bitmaps中叫做偏移量。
命令
setbit
实例
每个独立用户是否访问过网站放在Bitmaps中,将访问的用户记为1,没有访问的用户记为0,用户偏移量作为用户id。
setbit \
设置键的第offset个位的值(从0算起) , 假设现在有20个用户,userid=1, 6, 11, 16, 19的用户对网站进行了访问, 那么当前Bitmaps初始化结果如图所示。
unique:users:202100101 代表2021-01-01这天的独立访问用户的Bitmaps:
getbit
getbit \
实例
bitcount
bitcount \
bitop
bitop and(or/not/xor) \
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
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 \
将所有元素添加到指定的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 \
127.0.0.1:6379> pfcount program
(integer) 4
pfmerge
pfmerge \
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>