redis查找附近的人

薄洪涛4年前数据库957

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 集合的大小。

标签: redis

相关文章

redis中的事务处理

redis事务单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令...

redis缓存雪崩,缓存击穿,缓存穿透

redis缓存雪崩,缓存击穿,缓存穿透

缓存雪崩同一时间大量redis缓存数据失效,造成大量请求涌入数据库,数据库压力增大崩掉解决方案缓存过期时间加随机值增加过期表示,缓存过期后,自动更新缓存缓存穿透缓存和数据库中都没有的数据,每次查询都会...

redis中HyperLogLog基数统计

简介Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常...

发表评论    

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