数据类型_分享redis中除5种基础数据类型以外的高级数据类型

众所周知,在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。如下图:

017ab670294cd55d5634bc6f9cd936be.png

2)、PFCOUNT

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

223ed8259b6993338d4d90b4c6e343a3.png

3)、PFMERGE

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

a7b05bfc2eafa8227de1d666c57b70e1.png

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

083796f8f9142dd0da4c789c1101472f.png

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

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

2、GEO

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

下面具体介绍下:

1)、GEOADD

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

08b48f977000512cecc11e9819c70610.png

2)、GEODIST

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

bf8ec858dcc98593907243518d85ebb5.png

3)、GEOPOS

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

ae7cd19d74ad0713ff4e74987295fb4c.png

4)、GEOHASH

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

61ddc577d3e7d30862f2348ded552751.png

5)、GEOREDIUS

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

65f53a3bee6c410acc32df89d76269eb.png

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

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

4562f2abcae8e0dcd49bcb21eafb76e1.png

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

7c482d910b76d3783f74c9bcafc34446.png

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

80d2ee7489f98dbb8da1e5785fe91604.png

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

6e8fbf49a4e9fcf0857cca0fa3ef9dbe.png

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

0b62dc4dba500496691ab19345b3e2e9.png

6)、GEORADIUSBYMEMBER

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

63389a94c01bfbdaa7ffb86fb5960813.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,如下图:

7d809ae2439ff4b07bb776f097f1e6ed.png
d1cbf4c218473e0f11db1ce496cdd802.png

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

a0179eb350205ab7e5ea3eafbbd1136e.png

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

4ed5770e3cd41173e5b60e1c3caec1f6.png

2)、BITCOUNT

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

aa9b3b7ec17da159cdde09b91cc54ec6.png
795950960e27c593c09d5554d4ba9ad7.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,看下执行结果。如下图

c2e3aa2b1c4c893ae3a4f013003679cc.png
3df9b11eee86f1c96a1becabdbac9cec.png
54868e6becc4a9f0dffe2b674c90ead8.png

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

bd86d21e7569d5ffca0d0dd3324939d0.png
db2ff3f50a1061ce4a9bae5f5e006c37.png
fd3f422b52baa4c07869c4d9e4fea41b.png

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

d5f5b5aa9fcfa518319a15c84800e158.png
d0ef49fe645a49b94c063b32bd53c0e1.png
cc6f4fe7d3ad2c3ef04bf0b1bfa3911e.png

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

9a9c8bff3997c6f16d5e1a005ed66f1d.png
445c7f36bcf0dd112048af5e7b7fa998.png
996c4287b4d7fa72e4f7f06a0ed629c3.png

4)、BITPOS

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

e831edbd3e3b4b05505c9a2d17427f8a.png
cd90cb8e40c34c1d0cc75d63407d1e0e.png

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值