2MUCH

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内的元素

注意: