Redis-Redis6新数据类型

Bitmaps

本身不是一种数据类型,实际上是每个单位存储0和1的字符串,可以看作是以位为单位的数组,下标称为偏移量(从0开始)。但是操作命令和字符串不同。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[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 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[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对地理坐标操作的数据类型

1
2
3
4
5
[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英尺