今天公司要用到Redis-Geo的地理位置存储。
由于ThinkPHP3.1又太老,PHP只能用到5.3,很多组件不能用,实在没办法只好自己造了个坑。
发现原生Redis的rawCommand()
通用指令居然不能用,真是无语了。
原来这样些的Redis:
var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km', 'WITHCOORD'));
现在只能改成这样:
$redis->georadius($key, $longitude, $latitude, $this->range, 'km', array('WITHCOORD', 'WITHDIST', 'COUNT'=>$num, 'asc'));
而且在使用geoadd
、georadius
之类指令的时候需要非常小心,所有关于经纬度的参数,都需要强制转换成double
类型,否则经纬度会被强制写入成0.0000
的浮点数。
下面总结一些geo
操作常用的指令集:
geoadd 写入
georadius 使用经纬度查询
geopos 查询单个geo
ZRANGEBYLEX 查询整个set
ZREMRANGEBYLEX 清空整个set
最后一个坑,可能细心的朋友就会问,上面怎么没有更新geo
的指令?
在redis-geo中,没有update的指令,如果需要更新geo信息,直接使用geoadd()
指令即可。
但是!真正坑的地方来了。
当geo的key_name
不存在的时候,使用geoadd
的返回值是1
。
当key_name
存在的时候,使用geoadd
的返回值是0
。
所以当我们使用if
判断的时候需要非常小心。