七天玩转Redis | Day3、Redis地理位置、基数统计、位图场景使用总结

1.Gaospatial地理位置

添加一个或多个地理位置的坐标
Redis的Gaospatial中添加地理位置坐标的命令是GEOADD,格式如下:

GEOADD key longitude latitude member [longitude latitude member …]

  1. key为该地理位置的索引
  2. longitude表示该位置的经度
  3. latitude表示该位置的纬度
  4. member表示地名
  5. [longitude latitude member …]表示可以重复添加,中间以空格分隔
127.0.0.1:6379> GEOADD china:city 114.08 22.54 shenzhen
(integer) 1
127.0.0.1:6379> GEOADD china:city 116.10 39.90 beijing
(integer) 1
127.0.0.1:6379> GEOADD china:city 113.66 34.75 zhengzhou
(integer) 1
127.0.0.1:6379> GEOADD china:city 112.54 37.85 taiyuan
(integer) 1
127.0.0.1:6379> GEOADD china:city 113.28 23.12 guangzhou
(integer) 1
127.0.0.1:6379>  GEOADD china:city 120.15 30.28 hangzhou 118.76 32.04 nanjing
(integer) 2

**注意:**在输入经纬度的时候,数据是可以任意保留小数位的,而且现在虽然是一个一个写入,但是在开发的实际操作中,我们可以通过读取数据库直接写入。

查询一个或多个地理位置坐标
我们可以通过GEOPOS命令来获取指定地理位置的坐标,格式如下:

GEOPOS key member [member …]

  1. key表示输入时该地理位置的索引
  2. member表示地理位置的名称,可以输入多个中间以空格分开

如我们要查询郑州、北京和长沙的地理坐标,(但是长沙的不存在,则返回null)

127.0.0.1:6379> GEOPOS china:city zhengzhou
1) 1) "113.65999907255172729"
   2) "34.74999926510690784"
127.0.0.1:6379> GEOPOS china:city beijing changsha
1) 1) "116.09999924898147583"
   2) "39.90000009167092543"
2) (nil)

查询两地之间的距离
在Redis中查询两个地方距离的命令是:

GEODIST key member1 member2 [unit]

  1. key为要查询的两个地理位置的索引,注意两个地理位置需要使用同一个索引,
  2. member1为第一个位置名称
  3. member2为第二个位置名称
  4. [unit]为显示的单位,可以是m(米,默认)、km(千米)、ft(英尺)、mi(英里)

如我们查询郑州到杭州的直线距离,以米为单位,

127.0.0.1:6379> GEODIST china:city zhengzhou hangzhou
"785609.9719"
127.0.0.1:6379> GEODIST china:city zhengzhou hangzhou m
"785609.9719"

再查询深圳到北京的直线距离:

127.0.0.1:6379> GEODIST china:city shenzhen beijing km
"1940.2709"

以坐标为中心来范围搜索地理位置

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]

  1. key为要查询的地理位置的索引
  2. longitude为该地理位置的经度
  3. latitude为该地理位置的纬度
  4. radius表示要查询的半径
  5. m|km|ft|mi表示单位
  6. [WITHCOORD]可选,表示是否输出经纬度
  7. [WITHDIST]可选,表示是否输出距离
  8. [WITHHASH]可选,表示是否输出哈希值
  9. [COUNT count]可选,表示输出几个数据
  10. [ASC|DESC]可选,表示按照距离升序还是降序排列,ASC升序,DESC降序

比如我们查询深圳市福田区(114.05571,22.52245)半径1000km之内的城市,

127.0.0.1:6379> GEORADIUS china:city 114.05 22.52 1000 km
1) "shenzhen"
2) "guangzhou"

查询深圳市福田区(114.05571,22.52245)半径1000km之内的城市,同时输出位置:

127.0.0.1:6379> GEORADIUS china:city 114.05 22.52 1500 km WITHCOORD
1) 1) "shenzhen"
   2) 1) "114.08000081777572632"
      2) "22.53999903789756587"
2) 1) "guangzhou"
   2) 1) "113.27999979257583618"
      2) "23.1199990030198208"
3) 1) "hangzhou"
   2) 1) "120.15000075101852417"
      2) "30.2800007575645509"
4) 1) "zhengzhou"
   2) 1) "113.65999907255172729"
      2) "34.74999926510690784"
5) 1) "nanjing"
   2) 1) "118.75999957323074341"
      2) "32.03999960287850968"

查询深圳市福田区(114.05571,22.52245)半径1000km之内的城市,同时输出距离:

127.0.0.1:6379> GEORADIUS china:city 114.05 22.52 1500 km WITHDIST
1) 1) "shenzhen"
   2) "3.8011"
2) 1) "guangzhou"
   2) "103.3692"
3) 1) "hangzhou"
   2) "1055.1042"
4) 1) "zhengzhou"
   2) "1360.8264"
5) 1) "nanjing"
   2) "1156.3230"

以位置为中心来范围搜索地理位置
上面我们是以坐标的形式来进行范围搜索的,还有一种方式是以位置为中心进行搜索,这种的可以用于输入一个确定的地理位置进行范围搜索,这个命令和上面利用坐标进行范围搜索的使用方法基本一样,命令格式如下:

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]

  1. key为要查询的地理位置的索引
  2. member为要作为中心点的地理位置
  3. radius表示要查询的半径
  4. m|km|ft|mi表示单位
  5. [WITHCOORD]可选,表示是否输出经纬度
  6. [WITHDIST]可选,表示是否输出距离
  7. [WITHHASH]可选,表示是否输出哈希值
  8. [COUNT count]可选,表示输出几个数据
  9. [ASC|DESC]可选,表示按照距离升序还是降序排列,ASC升序,DESC降序

如我们查询以太原为中心,800km以内的城市:

127.0.0.1:6379> GEORADIUSBYMEMBER china:city taiyuan 800 km
1) "zhengzhou"
2) "taiyuan"
3) "beijing"

Hyperloglog基数统计

  基数计算(cardinality counting)指的是统计一批数据中的抛去重复元素后数据的个数。它通常用于查询网站的访问人数。

使用基数统计的优势就是内存是固定的,使用内存非常小,可以减轻内存的使用,提升查询的效率!

创建一组数据
在进行基数统计之前肯定是要有数据源的,在Hyperloglog中可以通过PFADD命令创建数据
格式如下:

PFADD key element [element …]

  1. key为数据集的索引
  2. element为数据集中的数据,可以输入多个,中间以空格分隔
127.0.0.1:6379> PFADD mynum1 a b c d e f g
(integer) 1
127.0.0.1:6379> PFADD mynum2 f g h i j k l m
(integer) 1
127.0.0.1:6379> PFADD mynum3 n o p q n
(integer) 1

统计数据集的基数数量
该命令就可以统计一个数据集的基数是多少,命令格式如下:

PFCOUNT key [key …]
key为要查询的数据集的索引,可以输入多个,以空格分开

127.0.0.1:6379> PFCOUNT mynum3
(integer) 4
127.0.0.1:6379> PFCOUNT mynum1
(integer) 7

合并数据集
合并数据集是可以将一个或多个数据集求并集,命令格式如下:

PFMERGE destkey sourcekey [sourcekey …]

  1. destkey为要合并到的数据集的名称
  2. sourcekey为要合并的数据集的索引,可以存在多个,中间以空格分隔
127.0.0.1:6379> PFMERGE mynum4 mynum1 mynum2
OK
127.0.0.1:6379> PFCOUNT mynum4
(integer) 13

Bitmap位图场景

在Redis中的Bitmap位图是通过操作二进制位来实现的,在其中存储的数据要么是0,要么是1,比如下面这个{0,1,1,0,0,0,0}。而且位图中的每一个数据都是有唯一的一个下标对应的,和我们学习的数组类似。

主要使用场景:

比如我们想要统计CSDN用户是否活跃,假设CSDN有一亿用户,那么我们就将这一亿个用户的状态都表示为0,如果用户登录就表示活跃,那么我们就将该用户对应的数据置为1,但其实在Redis中一亿个0或者1的数据量是非常小的。
或者说用户登录,如果登录就用1表示,未登录就用0表示;公司打卡,打卡就用1表示,当天未打卡就用0表示。

输入位图数据集
在Redis中给一个Bitmap输入数据的命令是SETBIT,格式如下:

SETBIT key offset value

  1. key为该数据集的索引
  2. offset为要输入的数据的下标
  3. value为要输入的数据,0或1

如我们输入某个员工一周的打卡记录,数据集的索引是“mybit1”,注意数据集的下标是从0开始的。

127.0.0.1:6379> SETBIT mybit1 0 0    #下标为0表示第一天
(integer) 0
127.0.0.1:6379> SETBIT mybit1 1 1    #下标为1表示第二天
(integer) 0
127.0.0.1:6379> SETBIT mybit1 2 0    #下标为2表示第三天
(integer) 0
127.0.0.1:6379> SETBIT mybit1 3 0
(integer) 0
127.0.0.1:6379> SETBIT mybit1 4 1
(integer) 0
127.0.0.1:6379> SETBIT mybit1 5 1
(integer) 0
127.0.0.1:6379> SETBIT mybit1 6 0
(integer) 0

统计1的个数

BITCOUNT key [start end]

  1. key表示位图数据集的索引
  2. [start end]表示开始和结束的下标,默认不写就是统计数据集中所有数据

如我们要查询该用户这一周打卡的天数

127.0.0.1:6379> BITCOUNT mybit1
(integer) 3
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值