Redis-Redis6新数据类型
2022-07-31
Redis-Redis6新数据类型
Bitmaps
本身不是一种数据类型,实际上是每个单位存储0和1的字符串,可以看作是以位为单位的数组,下标称为偏移量(从0开始)。但是操作命令和字符串不同。
[commands]
- setbit key offset value #
- getbit key offset
- bitcount key [start] [end] # 以字节为单位统计1的个数,这和上面两个命令以bit为单位操作不同
- bitop ope destkey key [key...] # 对一或多个key做操作并保存在destkey:and(交集),or(并集),not(非),xor(异或)
127.0.0.1:6379> setbit online1 0 1
(integer) 0
127.0.0.1:6379> setbit online1 1 1
(integer) 0
127.0.0.1:6379> getbit online1 0
(integer) 1
127.0.0.1:6379> bitcount online1 # 没有指定前后,就是求所有的1的个数
(integer) 2
127.0.0.1:6379> setbit online1 15 1
(integer) 0
127.0.0.1:6379> setbit online1 16 1
(integer) 0
127.0.0.1:6379> bitcount online1 0 1 # 此时online1= 11000000 00000001 10000000
(integer) 3 # 求的是第0到第1个字节中的1的个数
127.0.0.1:6379> bitcount online1 0 2
(integer) 4
127.0.0.1:6379> setbit online2 1 1
(integer) 0
127.0.0.1:6379> setbit online2 15 1
(integer) 0
127.0.0.1:6379> bitop and online1 online2
(integer) 2 # 返回and 1 1 的位个数
127.0.0.1:6379> bitop or online1 online2
(integer) 2
127.0.0.1:6379> setbit online2 16 0
(integer) 0
127.0.0.1:6379> bitop or online1 online2
(integer) 3
127.0.0.1:6379> setbit key1 0 1
(integer) 0
127.0.0.1:6379> bitop not key2 key1 # key1的取反结果保存到key2
(integer) 1
127.0.0.1:6379> bitop xor key3 key1 key2 # key1和key2的异或结果保存到key3,key3应该是全1
(integer) 1
127.0.0.1:6379> bitcount key3
(integer) 8
HyperLogLog
基数问题
例如给一个大的数字集合,要求里面包含有多少个不重复的数字。如{1,2,2,3,3,5}的基数是4。
如果是用set、bitmaps等数据结构来处理的话,占用空间会较大。能否能够降低一定的精度来平衡存储空间?于是HyperLogLog就出现了。
需要注意的是,HyperLogLog只统计基数,不存储元素,所以无法获取真实的元素。
优势
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
[commands]
- pfadd key values1 [values2 ...] # 加入1或多个value
- pfcount key # 获取基数
- pfmerge destkey key1 key2 [...] # 合并多个key到destkey
127.0.0.1:6379> pfadd pfkey1 "v1"
(integer) 1
127.0.0.1:6379> pfadd pfkey1 "v2"
(integer) 1
127.0.0.1:6379> pfadd pfkey1 "v1"
(integer) 0
127.0.0.1:6379> pfcount pfkey1
(integer) 2 # 两个v1算一个
127.0.0.1:6379> pfadd pfkey2 "v3"
(integer) 1
127.0.0.1:6379> pfadd pfkey2 "v1"
(integer) 1
127.0.0.1:6379> pfmerge pfkey3 pfkey1 pfkey2 # 将pfkey1和pfkey2合并到pfkey3
OK
127.0.0.1:6379> pfcount pfkey3 # 由于pfkey1和pfkey2中都含有v1,所以v1只算一个
(integer) 3
Geospatial
redis对地理坐标操作的数据类型
[commands]
- geoadd key longitude latitude member [longitude latitude member...] # 添加一或多个地理位置(经度、纬度、名称)
- geopos key member # 获得指定地区的坐标值
- geodist key member1 member2 [m/km/ft/mi] # 获取两个位置之间的直线距离(默认以米为单位)
- georadius key longitude latitude radius m/km/ft/mi # 获取给定位置为中心的,半径radius内的元素
注意:
- 两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。
- 有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。
- 当坐标位置超出指定范围时,geoadd将会返回一个错误。
- m米;km千米;mi英里;ft英尺