码农日记

薄洪涛的个人博客

redis查找附近的人

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐标。

  • geopos:获取地理位置的坐标。

  • geodist:计算两个位置之间的距离。

  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。

  • geohash:返回一个或多个位置对象的 geohash 值。


直接看Yii2.0 代码

// 录入三个经纬度坐标
// GEOADD key longitude latitude member
Yii::$app->redis->GEOADD('postion', '117.133772', '36.686122', 'boht');
Yii::$app->redis->GEOADD('postion', '117.139916', '36.678641', 'guodong');
Yii::$app->redis->GEOADD('postion', '117.152412', '36.670188', 'lpt');


// 计算boht和guodong的距离,单位为米
// GEODIST key member1 member2 [m|km|ft|mi]
$posDist = Yii::$app->redis->GEODIST("postion", "boht", "guodong");
print_r($posDist);

// 计算出指定经纬度半径为1000米内的元素
// GEORADIUS Sicily 15 37 200 km WITHDIST
$posNear = Yii::$app->redis->GEORADIUS("postion", "117.133772", "36.686122", 1000, "m", "WITHDIST");
print_r($posNear);


返回结果

boht@mac basic % php yii redis/index
996.6651
Array
(
    [0] => Array
        (
            [0] => boht
            [1] => 0.1675
        )

    [1] => Array
        (
            [0] => guodong
            [1] => 996.4979
        )

)


注意

在一个地图应用中,车的数据、餐馆的数据、人的数据可能会有百万千万条,如果使用 Redis 的 Geo 数据结构,它们将全部放在一个 zset 集合中。在 Redis 的集群环境中,集合可能会从一个节点迁移到另一个节点,如果单个 key 的数据过大,会对集群的迁移工作造成较大的影响,在集群环境中单个 key 对应的数据量不宜超过 1M,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。 所以,这里建议 Geo 的数据使用单独的 Redis 实例部署,不使用集群环境。 如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。这样就可以显著降低单个 zset 集合的大小。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权所有 | 转载请标明出处