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。如下图:
2)、PFCOUNT
命令:PFCOUNT key[key ...]返回给定的HyperLogLog的基数估算值。如果多个HyperLogLog则返回基数估算值之和(注意多个HyperLogLog 在redis集中的同⼀个solt上才能返回基数,不在同⼀个solt上会报错)。如下图:
3)、PFMERGE
命令:PFMERGE mergekey sourcekey[sourcekey ...]将多个HyperLogLog合并为⼀个HyperLogLog(mergekey 合并后的
key,sourcekey需要合并的key),注意多个HyperLogLog 在redis集中的同⼀个solt上才能合并,不在同⼀个solt上会报错。如下图:
解决这个异常(CROSSSLOT Keys in request don't hash to the same slot):只需要合并或同时返回的多个HyperLogLog在同⼀个solt上就能解决问题了。redis提供了⼀种特定的标签{},这个{}内的字符串才参与计算hash solt。如下图:
从上图可以看出PFCOUNT 返回多个HyperLogLog和PFMERGE将多个HyperLogLog合并都可以了
应⽤场景:实现记录⽹站每天访问的独⽴IP数量、系统的有多少⽤户访问、直播间的观看⼈数等。
2、GEO
redis在3.2版本⾥⾯添加了⼀个对地理位置(GEO)的⽀持。
下⾯具体介绍下:
1)、GEOADD
命令:GEOADD key longitude latitude member [ longitude latitude member ...]添加指定的地理空间位置到指定的key中。如下图:
2)、GEODIST
命令:GEODIST key member1 member2 [unit]返回给定两个位置之间的距离。如果有⼀个位置不存在就返回空值,unit是单位参数,其值为 m(⽶)、km(千⽶)、mi(英⾥)、ft(英尺)中的⼀个。如下图:
3)、GEOPOS
命令:GEOPOS key member [member ...] 从key⾥返回所有给定位置,返回⼀个有经度和纬度组成的⼀个⼆维数组。如下图:
4)、GEOHASH
命令:GEOHASH key member [member ...]返回元素的经纬度编码字符串。如下图:
5)、GEOREDIUS
命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]以给定经纬度为中⼼,返回与中⼼的距离不超过给定最⼤距离的所有位置元素。单位可以使⽤m(⽶)、km(千⽶)、mi(英⾥)、ft(英尺)中的⼀个。如下图:
在给定以下可选项时,命令就会返回额外的信息:
WITHDIST:在返回位置元素的同时,将位置元素与中⼼之间的距离⼀起返回。如下图:
WITHCOORD:将位置元素的经纬度⼀起返回。如下图:
WITHHASH: 返回位置元素经过原始 GEOHASH编码的有序集合分值。如下图:
ASC/DESC:ASC按中⼼的位置,从近到远的⽅式返回位置元素,DESC按中⼼的位置,从远到近的⽅式返回位置元素,如下图:
COUNT:默认情况时返回所有的位置元素,但使⽤了COUNT选项,获取前X个匹配的元素。注意:使⽤COUNT选项获取少量元素,但执⾏速度不会因减少获取的元素⽽加快。如下图:
6)、GEORADIUSBYMEMBER
命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]和GEORADIUS命令⼀样,都是返回指定范围内的元素,有⼀点不同,这个命令是设置位置元素为中⼼点。如下图:
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,如下图:
执⾏命令:setbit bitkey 6 1,将偏移量为6的位设置为1 ,那bitkey为01100011 01100010 01100011,转成字符串就是cbc。如下图:
执⾏命令:setbit bitkey 23 0,将偏移量为第23的位 设置为0 ,那bitkey为01100011 01100010 01100010,转成字符串就是cbb。如下图:
2)、BITCOUNTredis支持的五种数据类型
命令:bitcount key [start] [end] 计算给定字符串中,被设置为1的⽐特位的数量(可通过start或end参数,
让计数只在特定的位上进⾏)。若key不存在,当成空字符串处理,返回0,否则返回被设置为1的位的数量。注:start和end是⼀个字节,⼀个字节为8位如下图:
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,看下执⾏结果。如下图:
or(或)操作:执⾏命令bitop or {bit}:key3 {bit}:key1 {bit}:key2,看下执⾏结果。如下图:
not(⾮)操作:执⾏命令bitop not {bit}:key4 {bit}:key1,看下执⾏结果。如下图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论