文:黄健宏
Redis 3.2 版本的其中一个重要更新就是提供了对地理位置(GEO)数据的支持, 这一特性允许用户将地理位置信息储存到 Redis 数据库中, 并对它们执行距离计算、范围查找等操作。
尽管 Redis 3.2 正式释出已经有一段时间了, 但是 Redis 最常用的 Python 库 redis-py 却一直没有添加对 GEO 特性的支持, 这给使用 Python 操作 Redis 的用户们带来了不少麻烦。
可喜的是, 今天笔者在逛 github 的时候, 发现 redis-py 的最新版本已经添加了对 GEO 特性的支持, 所以今天就让我们一起来看看如何在 redis-py 中处理地理位置数据。
下载并安装新版 redis-py
因为支持 GEO 命令的最新版 redis-py 仍处于开发阶段, 所以它无法通过 pypi 取得。 为此, 我们需要从 redis-py 的 github 页面手动克隆最新版本的 redis-py :
$ git clone git@github.com:andymccurdy/redis-py.git
在克隆操作执行完毕之后, 我们进入到 redis-py 文件夹中, 然后将这个新版本安装到系统中:
$cd redis-py
$sudo setup.py install
如果你的系统已经安装了其他版本的 redis-py , 那么记得在安装新版之前, 先将旧版本卸载掉。
在安装操作执行完毕之后, 我们在解释器中载入 redis-py 库:
>>> from redis import Redis
>>> r = Redis()
通过对 Redis() 对象的属性进行访问, 我们可以确认各个 GEO 命令在 redis-py 中都有了相应的方法:
>>> for i in dir(r):
... if i.startswith("geo"):
... print(i)
...
geoadd
geodist
geohash
geopos
georadius
georadiusbymember
接下来, 就让我们逐个试试这些方法。
添加地理位置
首先要测试的是 geoadd() 方法, 这个方法调用的是 Redis 的 GEOADD 命令, 它的文档如下:
geoadd(self, name, *values) method of redis.client.Redis instance
Add the specified geospatial items to the specified key identified
by the ``name`` argument. The Geospatial items are given as ordered
members of the ``values`` argument, each item or place is formed b
the triad latitude, longitude and name.
作为例子, 以下代码展示了如何使用 geoadd() 方法, 将清远、广州和佛山这三个城市的坐标添加到 “Guangdong” 这个键里面:
>>> r.geoadd("Guangdong", "113.