今天公司要用到Redis-Geo的地理位置存储。

由于ThinkPHP3.1又太老,PHP只能用到5.3,很多组件不能用,实在没办法只好自己造了个坑。

发现原生Redis的rawCommand()通用指令居然不能用,真是无语了。

原来这样些的Redis:

  1. var_dump($redis->rawCommand('georadius', 'citys', '114', '30', '100', 'km', 'WITHCOORD'));

现在只能改成这样:

  1. $redis->georadius($key, $longitude, $latitude, $this->range, 'km', array('WITHCOORD', 'WITHDIST', 'COUNT'=>$num, 'asc'));

而且在使用geoaddgeoradius之类指令的时候需要非常小心,所有关于经纬度的参数,都需要强制转换成double类型,否则经纬度会被强制写入成0.0000的浮点数。

下面总结一些geo操作常用的指令集:

  1. geoadd 写入
  2. georadius 使用经纬度查询
  3. geopos 查询单个geo
  4. ZRANGEBYLEX 查询整个set
  5. ZREMRANGEBYLEX 清空整个set

最后一个坑,可能细心的朋友就会问,上面怎么没有更新geo的指令?

在redis-geo中,没有update的指令,如果需要更新geo信息,直接使用geoadd()指令即可。

但是!真正坑的地方来了。

当geo的key_name不存在的时候,使用geoadd的返回值是1

key_name存在的时候,使用geoadd的返回值是0

所以当我们使用if判断的时候需要非常小心。