Redis GEO 《Redis开发与运维读书笔记》

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhang_Red/article/details/82775136

简介

  • Redis 在 3.2 版本以后增加了地理位置 GEO 功能,支持存储地理位置信心用来实现注入附近位置、摇一摇等依赖地理位置的功能。
  • Redis的GEO功能的地产实现是基于zset的,GEO没有提供删除功能,但是由于GEO底层实现是zset,所以可以借助zrem删除地理位置
  • Redis的GEO功能借鉴了NoSQL数据库Ardb实现的,Ardb作者来自中国。

命令

  1. 增加地理位置信息
    geoadd key longitude latitude name [longitude latitude name ...]
    例如:
    geoadd guangdong:cities 113.2278442 23.1255978 guangzhou

    如果需要更新地理位置也可以使用geoadd命令,虽然记过返回为0;
    geoadd可以同时添加多个地理位置

  2. 计算两个地理位置之间的距离
    geodist key city-x city-y [unit]

    unit表示返回结果的单位,包含以下四种:

     m 表示单位为米。      meters
     km 表示单位为千米。kilometers
     mi 表示单位为英里。 miles
     ft 表示单位为英尺。  feet
    
  3. 获取地理位置信息
    geoops key member [member...]

  4. 计算指定位置范围内的地理信息位置集合
    georadius location-key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [withhash] [ASC|DESC] [COUNT count] [store key] [storedist key]

    georadiusbymember location-key location radius m|km|ft|mi [WITHCOORD] [withhash] [WITHDIST] [ASC|DESC] [COUNT count] [ [store key] [storedist key]

    georadiusgeoradiusbymember的所用是一样的,不同的是georadius用经纬度作为中心位置而georadiusbymember使用储存在位置集合里面的某个位置作为中心位置。

     WITHCOORD 	返回结果包含经纬度
     WITHDIST 	返回结果中包含到中心位置的距离
     withhash	返回结果中包含geohash
     ASC|DESC 	asc从近到远,desc从远到近。默认是无序的
     COUNT 		返回指定个数
     store key	将返回结果保存到指定key
     storedist key 将返回结果到中心位置的距离保存到指定key
    
  5. 获取geohash
    geohash key member [member...]
    Redis使用geohash将二维经纬度转换为一维字符串。
    geohash特点:

     GEO的是数据类型为zset,Redis将所有地理位置信息的geohash存放到zset中 
     字符串越长表示的位置越精确
     字符串越相近表示的位置越近
     geohash可以和经纬度互相转换
    
  6. 删除地理位置信息
    zrem key member
    GEO没有提供删除功能,但是由于GEO底层实现是zset,所以可以借助zrem删除地理位置

注意事项

在一个地图应用中,车的数据、餐馆的数据、人的数据可能会有百万千万条,如果使用 Redis 的 Geo 数据结构,它们将全部放在一个 zset 集合中。在 Redis 的集群环境中,集合可能会从一个节点迁移到另一个节点,如果单个 key 的数据过大,会对集群的迁移工作造成较大的影响,在集群环境中单个 key 对应的数据量不宜超过 1M,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。

所以,这里建议 Geo 的数据使用单独的 Redis 实例部署,不使用集群环境。

如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。这样就可以显著降低单个 zset 集合的大小。…

参考:https://juejin.im/book/5afc2e5f6fb9a07a9b362527/section/5b3b2e106fb9a04fcf59acb8

展开阅读全文

没有更多推荐了,返回首页