3、Redis的三种特殊数据类型

2020-10-20  本文已影响0人  i小雨

1、geospatial地理位置:

1603186630(1).jpg

将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
语法:GEOADD key longitude latitude member[longitude latitude member ...]

##########################################################
# GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。
# 有效的经度介于 -180 度至 180 度之间。
# 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。
##########################################################
127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijin
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.472644 31.231706 shanghai 114.085947 22.547 shenzhen 114.298572 30.584355 wuhan
(integer) 3
##########################################################

从key里返回所有给定位置元素的位置(经度和纬度)。
语法:GEOPOS key member [member ...]

127.0.0.1:6379> GEOPOS china:city wuhan   #获取指定城市的经度纬度
1) 1) "114.29857403039932251"
   2) "30.58435486605102227"
127.0.0.1:6379> GEOPOS china:city beijin shanghai
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "121.47264629602432251"
   2) "31.23170490709807012"

返回两个给定位置之间的距离。
语法:GEODIST key member1 member2 [unit]

##########################################################
#如果两个位置之间的其中一个不存在,那么命令返回空值。
#指定单位的参数 unit 必须是以下单位的其中一个:
#  m 表示单位为米。
#  km 表示单位为千米。
#  mi 表示单位为英里。
#  ft 表示单位为英尺。
#如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
##########################################################
127.0.0.1:6379> GEODIST china:city wuhan shenzhen  #查看武汉到深圳的直线距离
"894214.7596"
127.0.0.1:6379> GEODIST china:city wuhan shenzhen km
"894.2148"

##########################################################

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
语法:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

##########################################################
#范围可以使用以下其中一个单位:
# m 表示单位为米。
# km 表示单位为千米。
# mi 表示单位为英里。
# ft 表示单位为英尺。
#在给定以下可选项时, 命令会返回额外的信息:
#  WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
#  WITHCOORD: 将位置元素的经度和维度也一并返回。
#  WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
#命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
#  ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
#  DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。
##########################################################
127.0.0.1:6379> GEORADIUS china:city 110 30 800 km
1) "wuhan"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
1) "shenzhen"
2) "wuhan"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withdist
1) 1) "shenzhen"
   2) "923.4929"
2) 1) "wuhan"
   2) "417.8920"
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord
1) 1) "shenzhen"
   2) 1) "114.08594459295272827"
      2) "22.54699993773966327"
2) 1) "wuhan"
   2) 1) "114.29857403039932251"
      2) "30.58435486605102227"

##########################################################

指定成员的位置被用作查询的中心。(和GEORADIUS类似)
语法:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

127.0.0.1:6379> GEORADIUSBYMEMBER china:city wuhan 1000 km
1) "shenzhen"
2) "wuhan"
3) "shanghai"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city wuhan 1000 km withdist
1) 1) "shenzhen"
   2) "894.2148"
2) 1) "wuhan"
   2) "0.0000"
3) 1) "shanghai"
   2) "688.2824"

返回一个或多个位置元素的 Geohash 表示。(11位)
语法:GEOHASH key member [member ...]

#将二维的经纬度转换为一维的字符串表示
127.0.0.1:6379> GEOHASH china:city wuhan shenzhen
1) "wt3mbztwvb0"
2) "ws10k0dcg10"

小结:GEO底层的实现原理就是Zset,因此我们可以使用Zset命令操作GEO

127.0.0.1:6379> ZRANGE china:city 0 -1   #查询所有的城市
1) "shenzhen"
2) "wuhan"
3) "shanghai"
4) "beijin"
127.0.0.1:6379> ZREM china:city shanghai   #删除一个元素
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "shenzhen"
2) "wuhan"
3) "beijin"

2、HyperLogLogs:

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

使用

127.0.0.1:6379> PFADD key1 1 2 3 4 5 6 7   #创建第一组元素
(integer) 1
127.0.0.1:6379> PFCOUNT key1     #统计第一组元素基数数量
(integer) 7
127.0.0.1:6379> PFADD key2 6 6 7 7 8 9 10
(integer) 1
127.0.0.1:6379> PFCOUNT key2
(integer) 5
127.0.0.1:6379> PFMERGE key3 key1 key2    #合并两组元素到key3中(并集)
OK 
127.0.0.1:6379> PFCOUNT key3
(integer) 10

3、bitmaps

位存储

应用:如统计用户登陆状态(登录和未登录),记录打卡(265天)
Bitmap位图是通过操作二进制来进行记录,只有0或者1两个状态

测试
向week1中放进七天的打卡数据,1代表打卡,0代表未打卡

127.0.0.1:6379> SETBIT week1 1 1
(integer) 0
127.0.0.1:6379> SETBIT week1 2 1
(integer) 0
127.0.0.1:6379> SETBIT week1 3 1
(integer) 0
127.0.0.1:6379> SETBIT week1 4 1
(integer) 0
127.0.0.1:6379> SETBIT week1 5 1
(integer) 0
127.0.0.1:6379> SETBIT week1 6 0
(integer) 0
127.0.0.1:6379> SETBIT week1 7 0
(integer) 0

查看某一天是否打卡:(GETBIT)

127.0.0.1:6379> GETBIT week1 1   #查看周一是否打卡
(integer) 1
127.0.0.1:6379> GETBIT week1 6   #查看周六是否打卡
(integer) 0

统计打卡的天数:(BITCOUNT )

127.0.0.1:6379> BITCOUNT week1   #统计打卡的天数
(integer) 5                      #打卡天数为5天
上一篇下一篇

猜你喜欢

热点阅读