众所周知,在redis中的数据类型有String(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)五种。但在这5种之外还有高级数据类型。

今天和大家介绍下常用的高级数据类型:

1、HyperLogLog。

Redis中的HyperLogLog是用来做基数(数据集中不重复元素的数量就是基数)统计的算法。因为HyperLogLog只会计算输入元素的基数,不会存储元素本身,所以不能像其他数据类型一样,返回输入的各个元素。(版本2.8.9加入的)

特点:在输入元素的数量或体积非常大的时候,计算基数所需的空间总是固定的(空间很小)。

下面实际演示HyperLogLog

1)、PFADD

命令:PFADD key element[element ...] 添加指定元素到HyperLogLog中。有元素添加就返回1,没有就返回0。如下图:




redis高级系统设置 redis的高级数据类型_字符串


2)、PFCOUNT

命令:PFCOUNT key[key ...]返回给定的HyperLogLog的基数估算值。如果多个HyperLogLog则返回基数估算值之和(注意多个HyperLogLog 在redis集群中的同一个solt上才能返回基数,不在同一个solt上会报错)。如下图:


redis高级系统设置 redis的高级数据类型_redis高级系统设置_02


3)、PFMERGE

命令:PFMERGE mergekey sourcekey[sourcekey ...]将多个HyperLogLog合并为一个HyperLogLog(mergekey 合并后的key,sourcekey需要合并的key),注意多个HyperLogLog 在redis集群中的同一个solt上才能合并,不在同一个solt上会报错。如下图:


redis高级系统设置 redis的高级数据类型_redis高级系统设置_03


解决这个异常(CROSSSLOT Keys in request don't hash to the same slot):只需要合并或同时返回的多个HyperLogLog在同一个solt上就能解决问题了。redis提供了一种特定的标签{},这个{}内的字符串才参与计算hash solt。如下图:


redis高级系统设置 redis的高级数据类型_偏移量_04


从上图可以看出PFCOUNT 返回多个HyperLogLog和PFMERGE将多个HyperLogLog合并都可以了

应用场景:实现记录网站每天访问的独立IP数量、系统的有多少用户访问、直播间的观看人数等。

2、GEO

redis在3.2版本里面添加了一个对地理位置(GEO)的支持。

下面具体介绍下:

1)、GEOADD

命令:GEOADD key longitude latitude member [ longitude latitude member ...]添加指定的地理空间位置到指定的key中。如下图:


redis高级系统设置 redis的高级数据类型_偏移量_05


2)、GEODIST

命令:GEODIST key member1 member2 [unit]返回给定两个位置之间的距离。如果有一个位置不存在就返回空值,unit是单位参数,其值为 m(米)、km(千米)、mi(英里)、ft(英尺)中的一个。如下图:


redis高级系统设置 redis的高级数据类型_字符串_06


3)、GEOPOS

命令:GEOPOS key member [member ...] 从key里返回所有给定位置,返回一个有经度和纬度组成的一个二维数组。如下图:


redis高级系统设置 redis的高级数据类型_redis高级系统设置_07


4)、GEOHASH

命令:GEOHASH key member [member ...]返回元素的经纬度编码字符串。如下图:


redis高级系统设置 redis的高级数据类型_redis高级系统设置_08


5)、GEOREDIUS

命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]以给定经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素。单位可以使用m(米)、km(千米)、mi(英里)、ft(英尺)中的一个。如下图:


redis高级系统设置 redis的高级数据类型_字符串_09


在给定以下可选项时,命令就会返回额外的信息:

WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离一起返回。如下图:


redis高级系统设置 redis的高级数据类型_偏移量_10


WITHCOORD:将位置元素的经纬度一起返回。如下图:


redis高级系统设置 redis的高级数据类型_字符串_11


WITHHASH: 返回位置元素经过原始 GEOHASH编码的有序集合分值。如下图:


redis高级系统设置 redis的高级数据类型_数据类型_12


ASC/DESC:ASC按中心的位置,从近到远的方式返回位置元素,DESC按中心的位置,从远到近的方式返回位置元素,如下图:


redis高级系统设置 redis的高级数据类型_偏移量_13


COUNT:默认情况时返回所有的位置元素,但使用了COUNT选项,获取前X个匹配的元素。注意:使用COUNT选项获取少量元素,但执行速度不会因减少获取的元素而加快。如下图:


redis高级系统设置 redis的高级数据类型_字符串_14


6)、GEORADIUSBYMEMBER

命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]和GEORADIUS命令一样,都是返回指定范围内的元素,有一点不同,这个命令是设置位置元素为中心点。如下图:


redis高级系统设置 redis的高级数据类型_字符串_15


3、Bitmaps

bitmaps严格来说并不是一种新的数据类型,而是基于字符串位操作的集合,由于字符串是二进制安全的,并且最长可支持512M,所以它们可以用来存储2的32次方(512 * 1024 * 1024 * 8 )不同位的数据。

在介绍之前先了解下字母abc的二进制ASCII码如下:

a---01100001

b---01100010

c---01100011

下面具体介绍下:

1)、SETBIT /GETBIT

命令:SETBIT key offset value 对key所存储的字符串值,设置指定偏移量上的位(bit),value只能是1或者0。若key不存在时,自动生成一个新的字符串值,并返回0,否则指定偏移量原来存储的位。

命令:GETBIT key offset 获取key指定偏移量上的位(bit)。若offset比字符串值的长度大,或者key不存在时,返回0,否则返回字符串值偏移量上的位(bit)

实际操作下:给(bitkey)设置abc,从上面abc对应的二进制ASCII码。可知道bitkey 一共有24位,具体如下:01100001 01100010 01100011。从左往右,偏移量从0开始到23。获取偏移量为10,15,23的值 1,0,1,如下图:


redis高级系统设置 redis的高级数据类型_偏移量_16


redis高级系统设置 redis的高级数据类型_数据类型_17


执行命令:setbit bitkey 6 1,将偏移量为6的位设置为1 ,那bitkey为01100011 01100010 01100011,转成字符串就是cbc。如下图:


redis高级系统设置 redis的高级数据类型_偏移量_18


执行命令:setbit bitkey 23 0,将偏移量为第23的位 设置为0 ,那bitkey为01100011 01100010 01100010,转成字符串就是cbb。如下图:


redis高级系统设置 redis的高级数据类型_redis高级系统设置_19


2)、BITCOUNT

命令:bitcount key [start] [end] 计算给定字符串中,被设置为1的比特位的数量(可通过start或end参数,让计数只在特定的位上进行)。若key不存在,当成空字符串处理,返回0,否则返回被设置为1的位的数量。注:start和end是一个字节,一个字节为8位如下图:


redis高级系统设置 redis的高级数据类型_redis高级系统设置_20


redis高级系统设置 redis的高级数据类型_字符串_21


3)、BITOP

命令:bitop operation destkey key [key……]对一个或多个保存二进制位的字符串key进行位元操作(and(与)、or(或)、not(非)、xor(异或) 四种操作),并将结果保存到destkey上。除了not操作外,其他操作都可以接受一个或多个key作为输入,not只能接受一个key作为输入。

注意:(1)、当bitop处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看做0,空的key也被看做是包含0的字符串序列。(2)、保存到destkey的字符串的长度,和输入key中最长的字符串长度相等。

and(与)操作:先给{bit}:key1 和{bit}:key2 分别赋值a,b。然后执行命令:bitop and {bit}:keys {bit}:key1 {bit}:key2,看下执行结果。如下图


redis高级系统设置 redis的高级数据类型_redis高级系统设置_22


redis高级系统设置 redis的高级数据类型_字符串_23


redis高级系统设置 redis的高级数据类型_偏移量_24


or(或)操作:执行命令bitop or {bit}:key3 {bit}:key1 {bit}:key2,看下执行结果。如下图


redis高级系统设置 redis的高级数据类型_数据类型_25


redis高级系统设置 redis的高级数据类型_数据类型_26


redis高级系统设置 redis的高级数据类型_redis高级系统设置_27


not(非)操作:执行命令bitop not {bit}:key4 {bit}:key1,看下执行结果。如下图:


redis高级系统设置 redis的高级数据类型_偏移量_28


redis高级系统设置 redis的高级数据类型_偏移量_29


redis高级系统设置 redis的高级数据类型_redis高级系统设置_30


xor(异或)操作:执行命令bitop xor {bit}:key5 {bit}:key1 {bit}:key2,看下执行结果。如下图:


redis高级系统设置 redis的高级数据类型_redis高级系统设置_31


redis高级系统设置 redis的高级数据类型_redis高级系统设置_32


redis高级系统设置 redis的高级数据类型_偏移量_33


4)、BITPOS

命令:bitpos key bit [start] [end] 返回字符串里面第一个被设置为1或者0的bit位。如key为空字符或者0字节的字符串,那么将返回-1。注:start和end是一个字节,一个字节为8位。如下图:


redis高级系统设置 redis的高级数据类型_偏移量_34


redis高级系统设置 redis的高级数据类型_数据类型_35


应用场景:系统记录用户的登录情况、用户在线情况等。

注:在面试的时候,被问到redis的数据类型的时候,除了回答5种基础数据类型外,这三种高级数据类型,也可以回答一下。说不定能增加面试官对你印象。

今天的内容就到这里了,有什么不对的,欢迎大家在评论区中指出!