redis只查前5条数据_分享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。如下图:

f4a415b9952110cadd25ed13e910c7cd.png

2)、PFCOUNT

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

29fa673d7920fc72e31251eda523aa59.png

3)、PFMERGE

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

5ba636cdf4990255d12ac27e7f6e3155.png

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

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

2)、GEODIST

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

6cd135801ee6b1c90882b585d4685113.png

3)、GEOPOS

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

ead020de82c85c79dbdef8f322d1b8b4.png

4)、GEOHASH

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

764cd986dc55ca143edf3f38d341a9e0.png

5)、GEOREDIUS

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

1b487cb090303a27e1946c400e839517.png

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

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

5b968a4a73b10cb027f97126399f93ce.png

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

abbbff4ac4f28b52000b4ae5969262df.png

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

361f3acd65ce74e5977a189029a3913c.png

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

345a4b196498e5ebf6a5652fba2fef89.png

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

8262e584a9efe468e306d2d974df35c8.png

6)、GEORADIUSBYMEMBER

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

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
a79548caf3fa9c69ee9cc57bf6d44656.png

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

65c66bdd8a0604c3460e1d5ad3e70e68.png

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

8b70ad3b418a9d003d7802b6bada2e8e.png

2)、BITCOUNT

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

31b20d17e5e61f7d58d063369c1f6b5d.png
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
b451f00392fd5bfa64494dd1d36b9755.png
291cb5f0898a362ff94fad7d9bb6f1db.png

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

8416b7196607a1e412578c15a7ec0565.png
c9bd40b6a55d84e9dba95b02d2c01ceb.png
bade76eb6bc78c4caa2891cfc086db9b.png

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

365e8be4131fcf5e5c2e29cc3f3f83fe.png
f2abda342a366b0e817f17e7f5f52e47.png
ef5839f51c5fb602d84e9df780955e1c.png

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

33c78a66bb39ac1d187e71be95d687bd.png
6c3ee7358d34d25519478dc3e7ba4fa2.png
8d749176f138918bf2f5f34037d62f56.png

4)、BITPOS

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

e66dc38c961cf015f1ea15b680236763.png
40d60d7c5580afd7907c2bb1b962a14a.png

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值