【Redis】新数据类型Bitmap、HyperLogLog、Geospatial

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【Redis】新数据类型Bitmap、HyperLogLog、Geospatial,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、Bitmap

1、概念
在redis中,可以把 Bitmaps 想象成一个以比特位为单位的数组,数组的每个单元只能存储0和1,数组的下标在 Bitmaps 中叫做偏移量

实际上他就是字符串key-value类型,只不过不同之处就在于,它可以对value进行位操作,如图
在这里插入图片描述

2、命令

# 设置值,key随便取,offset表示key对应value的第几位,value只能设置0或者1
# 如果第一次初始化bitmaps时,偏移量非常大,那么整个初始化过程就可能执行的比较慢,造成redis的阻塞
setbit key offset value

# 获取值
getbit key offset

# 统计值被设置成1的bit的数量
# 还有2个参数start和end,它以字节为单位,1个字节=8比特
# start表示从哪个字节组开始,end表示到哪个字节组结束,end取负数时,表示取到倒数第n个字节组
bitcount key <start> <end>

# 复合操作
# operations 位移操作符,枚举值
  AND =与运算 &
  OR =或运算 |
  XOR =异或 ^
  NOT =取反 ~
# 运算结果将被存储到result这个key中,然后输出出来
# key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key
# 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等
bitop operation result key1 keyn...

# 返回指定key中第一次出现指定value(0/1)的位置
bitpos [key] [value]

我们结合实际的操作来看一下

127.0.0.1:6379> setbit bitKey 1 1
(integer) 0
127.0.0.1:6379> setbit bitKey 3 1
(integer) 0
127.0.0.1:6379> setbit bitKey 9 1
(integer) 0
127.0.0.1:6379> setbit bitKey 11 1
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> getbit bitKey 1
(integer) 1
127.0.0.1:6379> getbit bitKey 2
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> setbit bitKey2 1 1
(integer) 0
127.0.0.1:6379> setbit bitKey2 2 1
(integer) 0
127.0.0.1:6379> setbit bitKey2 10 1
(integer) 0
127.0.0.1:6379> setbit bitKey2 11 1
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> bitcount bitKey2
(integer) 4
127.0.0.1:6379> bitcount bitKey2 0 0
(integer) 2
127.0.0.1:6379> bitcount bitKey2 0 -1
(integer) 4
# 使用与计算来bitKey bitKey2中值为1的bit位的交集,输出到k1_and_k2这个key中,下面的2表示k1_and_k2的位数
127.0.0.1:6379> bitop and k1_and_k2 bitKey bitKey2
(integer) 2
127.0.0.1:6379> bitcount k1_and_k2
(integer) 2
# 使用或计算来bitKey bitKey2中值为1的bit位的并集,输出到k1_or_k2这个key中,下面的2表示k1_or_k2的位数
127.0.0.1:6379> bitop or k1_or_k2 bitKey bitKey2
(integer) 2
127.0.0.1:6379> bitcount k1_or_k2
(integer) 6
127.0.0.1:6379> getbit k1_or_k2 3
(integer) 1
127.0.0.1:6379> getbit k1_or_k2 5
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> bitpos k1_or_k2 1
(integer) 1
127.0.0.1:6379> bitpos k1_and_k2 1
(integer) 1
127.0.0.1:6379>

二、HyperLogLog

1、用途
Redis中HyperLogLog主要是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的,可以理解为在一个很庞大的数据中,获取不重复的数据

例如:
一组数据{1,2,3,5,7,5,7,8},它的基数集为{1,2,3,5,7,8},基数为6

2、命令

# 添加指定元素到 HyperLogLog 中
pfadd key element [element ...]
# 返回给定 HyperLogLog 的基数估算值
pfcount key [key ...]
# 将多个 HyperLogLog 合并为一个 HyperLogLog
pfmerge destkey sourcekey [sourcekey ...]

结合一个例子看一下

127.0.0.1:6379> pfadd k1 "java" "C" "python"
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> pfadd k1 "java" "C++"
(integer) 1
127.0.0.1:6379> pfcount k1
(integer) 4
127.0.0.1:6379>
127.0.0.1:6379> pfadd k2 "music" "basketball"
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> pfcount k2
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> pfcount k1 k2
(integer) 6
127.0.0.1:6379>
127.0.0.1:6379> pfmerge k1_add_k2 k1 k2
OK
127.0.0.1:6379>
127.0.0.1:6379> pfcount k1_add_k2
(integer) 6
127.0.0.1:6379>

三、Geospatial

1、用途
Redis GEO 主要用于存储地理位置信息(经度和纬度),并对存储的信息进行操作

经度范围-180到180,维度范围-85.05112878到85.05112878,超出这个范围就报错

2、命令

# 添加地理位置的坐标,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中
geoadd key longitude latitude member [longitude latitude member ...]
# 获取地理位置的坐标
geopos key member [member ...]
# 计算两个位置之间的距离,可以指定返回值的单位,米、千米、英尺、英里
geodist key member1 member2 [m|km|ft|mi]
# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
georadius key longitude latitude radius m|km|ft|mi
# 根据用户给定的元素坐标来获取指定范围内的地理位置集合
GEORADIUSBYMEMBER key member radius m|km|ft|mi

结合例子看下

127.0.0.1:6379> geoadd city 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> geopos city Palermo
1) 1) "13.36138933897018433"
   2) "38.11555639549629859"
127.0.0.1:6379> geodist city Palermo Catania
"166274.1516"
127.0.0.1:6379>
127.0.0.1:6379> geodist city Palermo Catania KM
"166.2742"
127.0.0.1:6379> georadius city 15 37 100 km
1) "Catania"
127.0.0.1:6379> georadius city 15 37 200 km
1) "Palermo"
2) "Catania"
127.0.0.1:6379>
127.0.0.1:6379> georadiusbymember city  Palermo  200 km
1) "Palermo"
2) "Catania"
127.0.0.1:6379>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136735.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!