用REDIS实现LBS系统
前言
LBS系统其实并不是什么难的问题,现在已经有很多成熟的框架,比如MongoDB就提供一套性能不错的LBS系统。但是前些日子从公司接手这份差事的时候,(由于当时的整个应用架构体系还比较简单)并不希望轻易就引入其他系统和架构,在当时仅有REDIS和MYSQL的时候,果断就选择从REDIS下手。由于是第一次写这种技术方面的文章,可能写的比较草,就算是抛砖引玉吧。有什么不足的地方请大家多多指正。
转载请注明出处:http://blog.youkuaiyun.com/kimjuny/article/details/48683005
准备工作
GeoHash是什么这里就不多讲了,如果不是很明白就多看一些百科和讲解吧:https://en.wikipedia.org/wiki/Geohash
这里丢上一丢Java的GeoHash库:https://github.com/kungfoo/geohash-java
Java的Redis客户端Jedis:https://github.com/xetorthio/jedis
思路1
在刚开始了解GeoHash的时候,我们知道GeoHash越长,它所代表的位置就越精准。那么在实现GeoHash的时候就可以引入这种思路,可不可以用字符串匹配的方式,根据我们所需要的精准度去前缀匹配出我们需要的结果呢?
如果你看到了上面的这一段脚本,你应该就会明白我的意思了。Redis在sorted set中插入元素的时候,如果所插入的元素的score值相等,那么它将会按照alphabetical的顺序插入元素。沿用这种sorted set特性:
这种结构,可以让我们比较轻松地实现对geohash的前缀搜索。
当我们需要搜索详细内容如uvxe下面的条目的时候

本文介绍了如何利用Redis和GeoHash实现地理位置系统(LBS)。首先讨论了在只有Redis和MySQL的情况下,选择Redis的原因。接着详细阐述了两种思路:思路1通过字符串匹配利用Sorted Set的特性,但存在查询效率和空间浪费的问题;思路2则是巧妙利用Sorted Set的score存储GeoHash,提高了查询速度和效率。最后,作者分享了实际应用中采用的第二种方案的良好效果。
最低0.47元/天 解锁文章
3222

被折叠的 条评论
为什么被折叠?



