众所周知,在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。如下图:
![f4a415b9952110cadd25ed13e910c7cd.png](https://img-blog.csdnimg.cn/img_convert/f4a415b9952110cadd25ed13e910c7cd.png)
2)、PFCOUNT
命令:PFCOUNT key[key ...]返回给定的HyperLogLog的基数估算值。如果多个HyperLogLog则返回基数估算值之和(注意多个HyperLogLog 在redis集群中的同一个solt上才能返回基数,不在同一个solt上会报错)。如下图:
![29fa673d7920fc72e31251eda523aa59.png](https://img-blog.csdnimg.cn/img_convert/29fa673d7920fc72e31251eda523aa59.png)
3)、PFMERGE
命令:PFMERGE mergekey sourcekey[sourcekey ...]将多个HyperLogLog合并为一个HyperLogLog(mergekey 合并后的key,sourcekey需要合并的key),注意多个HyperLogLog 在redis集群中的同一个solt上才能合并,不在同一个solt上会报错。如下图:
![5ba636cdf4990255d12ac27e7f6e3155.png](https://img-blog.csdnimg.cn/img_convert/5ba636cdf4990255d12ac27e7f6e3155.png)
解决这个异常(CROSSSLOT Keys in request don't hash to the same slot):只需要合并或同时返回的多个HyperLogLog在同一个solt上就能解决问题了。redis提供了一种特定的标签{},这个{}内的字符串才参与计算hash solt。如下图:
![e17cec5b95df0d5f3f8bbff058830d4a.png](https://img-blog.csdnimg.cn/img_convert/e17cec5b95df0d5f3f8bbff058830d4a.png)
从上图可以看出PFCOUNT 返回多个HyperLogLog和PFMERGE将多个HyperLogLog合并都可以了
应用场景:实现记录网站每天访问的独立IP数量、系统的有多少用户访问、直播间的观看人数等。
2、GEO
redis在3.2版本里面添加了一个对地理位置(GEO)的支持。
下面具体介绍下:
1)、GEOADD
命令:GEOADD key longitude latitude member [ longitude latitude member ...]添加指定的地理空间位置到指定的key中。如下图:
![6806c6c72e3497aff5e1b89b16689661.png](https://img-blog.csdnimg.cn/img_convert/6806c6c72e3497aff5e1b89b16689661.png)
2)、GEODIST
命令:GEODIST key member1 member2 [unit]返回给定两个位置之间的距离。如果有一个位置不存在就返回空值,unit是单位参数,其值为 m(米)、km(千米)、mi(英里)、ft(英尺)中的一个。如下图:
![6cd135801ee6b1c90882b585d4685113.png](https://img-blog.csdnimg.cn/img_convert/6cd135801ee6b1c90882b585d4685113.png)
3)、GEOPOS
命令:GEOPOS key member [member ...] 从key里返回所有给定位置,返回一个有经度和纬度组成的一个二维数组。如下图:
![ead020de82c85c79dbdef8f322d1b8b4.png](https://img-blog.csdnimg.cn/img_convert/ead020de82c85c79dbdef8f322d1b8b4.png)
4)、GEOHASH
命令:GEOHASH key member [member ...]返回元素的经纬度编码字符串。如下图:
![764cd986dc55ca143edf3f38d341a9e0.png](https://img-blog.csdnimg.cn/img_convert/764cd986dc55ca143edf3f38d341a9e0.png)
5)、GEOREDIUS
命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]以给定经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素。单位可以使用m(米)、km(千米)、mi(英里)、ft(英尺)中的一个。如下图:
![1b487cb090303a27e1946c400e839517.png](https://img-blog.csdnimg.cn/img_convert/1b487cb090303a27e1946c400e839517.png)
在给定以下可选项时,命令就会返回额外的信息:
WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离一起返回。如下图:
![5b968a4a73b10cb027f97126399f93ce.png](https://img-blog.csdnimg.cn/img_convert/5b968a4a73b10cb027f97126399f93ce.png)
WITHCOORD:将位置元素的经纬度一起返回。如下图:
![abbbff4ac4f28b52000b4ae5969262df.png](https://img-blog.csdnimg.cn/img_convert/abbbff4ac4f28b52000b4ae5969262df.png)
WITHHASH: 返回位置元素经过原始 GEOHASH编码的有序集合分值。如下图:
![361f3acd65ce74e5977a189029a3913c.png](https://img-blog.csdnimg.cn/img_convert/361f3acd65ce74e5977a189029a3913c.png)
ASC/DESC:ASC按中心的位置,从近到远的方式返回位置元素,DESC按中心的位置,从远到近的方式返回位置元素,如下图:
![345a4b196498e5ebf6a5652fba2fef89.png](https://img-blog.csdnimg.cn/img_convert/345a4b196498e5ebf6a5652fba2fef89.png)
COUNT:默认情况时返回所有的位置元素,但使用了COUNT选项,获取前X个匹配的元素。注意:使用COUNT选项获取少量元素,但执行速度不会因减少获取的元素而加快。如下图:
![8262e584a9efe468e306d2d974df35c8.png](https://img-blog.csdnimg.cn/img_convert/8262e584a9efe468e306d2d974df35c8.png)
6)、GEORADIUSBYMEMBER
命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]和GEORADIUS命令一样,都是返回指定范围内的元素,有一点不同,这个命令是设置位置元素为中心点。如下图:
![22e4639beaab712ce089f017acf8ef5c.png](https://img-blog.csdnimg.cn/img_convert/22e4639beaab712ce089f017acf8ef5c.png)
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,如下图:
![17256bf7b18769e5ccc8b30b762225c2.png](https://img-blog.csdnimg.cn/img_convert/17256bf7b18769e5ccc8b30b762225c2.png)
![a79548caf3fa9c69ee9cc57bf6d44656.png](https://img-blog.csdnimg.cn/img_convert/a79548caf3fa9c69ee9cc57bf6d44656.png)
执行命令:setbit bitkey 6 1,将偏移量为6的位设置为1 ,那bitkey为01100011 01100010 01100011,转成字符串就是cbc。如下图:
![65c66bdd8a0604c3460e1d5ad3e70e68.png](https://img-blog.csdnimg.cn/img_convert/65c66bdd8a0604c3460e1d5ad3e70e68.png)
执行命令:setbit bitkey 23 0,将偏移量为第23的位 设置为0 ,那bitkey为01100011 01100010 01100010,转成字符串就是cbb。如下图:
![8b70ad3b418a9d003d7802b6bada2e8e.png](https://img-blog.csdnimg.cn/img_convert/8b70ad3b418a9d003d7802b6bada2e8e.png)
2)、BITCOUNT
命令:bitcount key [start] [end] 计算给定字符串中,被设置为1的比特位的数量(可通过start或end参数,让计数只在特定的位上进行)。若key不存在,当成空字符串处理,返回0,否则返回被设置为1的位的数量。注:start和end是一个字节,一个字节为8位如下图:
![31b20d17e5e61f7d58d063369c1f6b5d.png](https://img-blog.csdnimg.cn/img_convert/31b20d17e5e61f7d58d063369c1f6b5d.png)
![1f7b560bc76d1a266ac87230450b5123.png](https://img-blog.csdnimg.cn/img_convert/1f7b560bc76d1a266ac87230450b5123.png)
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,看下执行结果。如下图:
![fc204438efc23fd0cdbb14a988f00dfe.png](https://img-blog.csdnimg.cn/img_convert/fc204438efc23fd0cdbb14a988f00dfe.png)
![b451f00392fd5bfa64494dd1d36b9755.png](https://img-blog.csdnimg.cn/img_convert/b451f00392fd5bfa64494dd1d36b9755.png)
![291cb5f0898a362ff94fad7d9bb6f1db.png](https://img-blog.csdnimg.cn/img_convert/291cb5f0898a362ff94fad7d9bb6f1db.png)
or(或)操作:执行命令bitop or {bit}:key3 {bit}:key1 {bit}:key2,看下执行结果。如下图:
![8416b7196607a1e412578c15a7ec0565.png](https://img-blog.csdnimg.cn/img_convert/8416b7196607a1e412578c15a7ec0565.png)
![c9bd40b6a55d84e9dba95b02d2c01ceb.png](https://img-blog.csdnimg.cn/img_convert/c9bd40b6a55d84e9dba95b02d2c01ceb.png)
![bade76eb6bc78c4caa2891cfc086db9b.png](https://img-blog.csdnimg.cn/img_convert/bade76eb6bc78c4caa2891cfc086db9b.png)
not(非)操作:执行命令bitop not {bit}:key4 {bit}:key1,看下执行结果。如下图:
![365e8be4131fcf5e5c2e29cc3f3f83fe.png](https://img-blog.csdnimg.cn/img_convert/365e8be4131fcf5e5c2e29cc3f3f83fe.png)
![f2abda342a366b0e817f17e7f5f52e47.png](https://img-blog.csdnimg.cn/img_convert/f2abda342a366b0e817f17e7f5f52e47.png)
![ef5839f51c5fb602d84e9df780955e1c.png](https://img-blog.csdnimg.cn/img_convert/ef5839f51c5fb602d84e9df780955e1c.png)
xor(异或)操作:执行命令bitop xor {bit}:key5 {bit}:key1 {bit}:key2,看下执行结果。如下图:
![33c78a66bb39ac1d187e71be95d687bd.png](https://img-blog.csdnimg.cn/img_convert/33c78a66bb39ac1d187e71be95d687bd.png)
![6c3ee7358d34d25519478dc3e7ba4fa2.png](https://img-blog.csdnimg.cn/img_convert/6c3ee7358d34d25519478dc3e7ba4fa2.png)
![8d749176f138918bf2f5f34037d62f56.png](https://img-blog.csdnimg.cn/img_convert/8d749176f138918bf2f5f34037d62f56.png)
4)、BITPOS
命令:bitpos key bit [start] [end] 返回字符串里面第一个被设置为1或者0的bit位。如key为空字符或者0字节的字符串,那么将返回-1。注:start和end是一个字节,一个字节为8位。如下图:
![e66dc38c961cf015f1ea15b680236763.png](https://img-blog.csdnimg.cn/img_convert/e66dc38c961cf015f1ea15b680236763.png)
![40d60d7c5580afd7907c2bb1b962a14a.png](https://img-blog.csdnimg.cn/img_convert/40d60d7c5580afd7907c2bb1b962a14a.png)
应用场景:系统记录用户的登录情况、用户在线情况等。
注:在面试的时候,被问到redis的数据类型的时候,除了回答5种基础数据类型外,这三种高级数据类型,也可以回答一下。说不定能增加面试官对你印象。
今天的内容就到这里了,有什么不对的,欢迎大家在评论区中指出!