PHP+Redis GEO 基本用法

利用 redis 实现附近的人功能,主要使用的是 redis 的 geo(GEO 存储经纬度,计算两地距离,范围计算等) 数据类型,需要注意的是 redis 的版本。

软件和环境
centOS7, Redis4, phpredis3.1.4, PHP7

PHP的扩展我使用的是 phpredis ,如果你使用的是 predis 的话,请自行查找 api 文档,基本操作方法相似。

目前 redis 支持以下 6 个 GEO 的相关操作
    geoadd:增加某个地理位置的坐标。
    geopos:获取某个地理位置的坐标。
    geodist:获取两个地理位置的距离。
    georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。
    georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。
    geohash:获取某个地理位置的geohash值。

连接redis

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 如果有密码的话,使用 auth
记录用户定位信息
我这里主要用 user:{id} 来做标记记录坐标信息

$redis->geoAdd("users", 116.365, 39.976, "user:1");
$redis->geoAdd("users", 116.366, 39.975, "user:2");
$redis->geoAdd("users", 116.364, 39.977, "user:3");

搜索附近的人
使用自己的坐标来搜索周边固定位置的用户

// 搜索附近 5km 的用户,并且返回距离

$options = ['WITHDIST'];
$lists = $redis->geoRadius('users', 116.36, 39.96, 5, 'km', $options);

获取用户列表
根据上述获取的列表,可以将其进行分页展示。具体可以找 phpredis 文档 阅读详情。

我这里只是讲解了一个大概的思路,在具体的业务逻辑中,做具体的处理。


$redis = new Redis();
$redis->connect('127.0.0.1', 6379, 60);
$redis->auth('');
 
//添加成员的经纬度信息
$redis->rawCommand('geoadd', 'citys', '116.40', '39.90', 'beijing');
$redis->rawCommand('geoadd', 'citys', '121.47', '31.23', 'shanghai');
$redis->rawCommand('geoadd', 'citys', '114.30', '30.60', 'wuhan');
 
//获取两个地理位置的距离,单位:m(米,默认), km(千米), mi(英里), ft(英尺)
var_dump($redis->rawCommand('geodist', 'citys', 'beijing', 'wuhan'));
var_dump($redis->rawCommand('geodist', 'citys', 'beijing', 'shanghai', 'km'));
 
//获取成员的经纬度
var_dump($redis->rawCommand('geopos', 'citys', 'shanghai'));
 
//获取成员的经纬度hash,geohash表示坐标的一种方法,便于检索和存储
var_dump($redis->rawCommand('geohash', 'citys', 'shanghai', 'wuhan'));
 
//基于经纬度坐标的范围查询
//查询以经纬度为114,30为圆心,100千米范围内的成员
var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km'));
 
//WITHCOORD表示获取成员经纬度
var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km', 'WITHCOORD'));
 
//WITHDIST表示获取到圆心的距离
var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km', 'WITHDIST'));
 
//WITHHASH表示获取成员经纬度HASH值
var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km', 'WITHHASH'));
 
//COUNT 数量,表示限制获取成员的数量
var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km', 'COUNT', '3'));
 
// ASC 根据圆心位置,从近到远的返回元素
// DESC 根据圆心位置,从远到近的返回元素
var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km', 'ASC'));
 
//基于成员位置范围查询
//查询以武汉为圆心,100千米范围内的成员
var_dump($redis->rawCommand('georadiusbymember', 'citys', 'wuhan', '100', 'km'));

非特殊说明,本博所有文章均为博主原创。

备注:相关侵权、举报、投诉及建议等,请联系站长

添加新评论

昵称
邮箱
网站