redis 5 分钟就能上手做地理信息库

给大家介绍个有趣的Redis功能,只用5分钟就能上手做地理信息库。Redis 3.2版本出的Geo模块,把原来只能存缓存的键值对,升级成了一套轻量级的地理系统。它不需要额外建库或建索引,就能在毫秒内完成查找位置、计算距离还有方圆搜索这些高频需求。下面分五步带你实操一下,把几个城市的坐标存进Redis,再算一算它们之间的距离,最后找出周围的人。 第一步把坐标存进去,用的是GEOADD命令。先准备好经纬度数据,在网上搜个“经纬度查询工具”就能拿到。把上海、苏州、北京、广州和广州海珠区的坐标一次性存进同一个key:china:city。五条命令执行完,这个key里就有五座城市的位置信息了。 第二步想确认一下存没存进去,就用GEOPOS命令。把刚才的城市名丢进去,瞬间就能拿到经纬度数据。可以看到坐标还在,说明数据已经入库成功了。 第三步算距离用GEODIST命令。输入两个城市名和单位参数(米、千米、英里或英尺),就能算出两地之间的距离。比如查上海到苏州的距离,结果显示约85公里,跟实际情况很接近。 第四步是找方圆内的人,用到的是GEORADIUS和GEORADIUSBYMEMBER这两个命令。以“上海黄浦区”为圆心画一个30公里的圆找找看周围有谁。先给黄浦区硬编码一个坐标(真实环境下最好用API获取)。运行命令后会返回结果列表,按距离远近排列。再把半径扩大到100公里试试,Suzhou就跑出来了。注意返回的顺序是距离近的先出现,加上count参数可以限制返回结果的数量。 第五步把位置转成Geohash字符串方便传输。执行GEOHASH命令会得到一个11位的字符串。字符串越接近表示位置越近;跨了省差距就会变大十几万位。这个原理和GPS的“U-TURN”类似,了解一下就行。其实底层还是用ZSET实现的要删除某个位置直接用ZREM命令就可以了。 现在数据已经全部处理完了。你也可以动手试一下这几步操作,直接运行一遍代码比文字描述更直观。