用REDIS实现LBS系统

用REDIS实现LBS系统

前言

LBS系统其实并不是什么难的问题,现在已经有很多成熟的框架,比如MongoDB就提供一套性能不错的LBS系统。但是前些日子从公司接手这份差事的时候,(由于当时的整个应用架构体系还比较简单)并不希望轻易就引入其他系统和架构,在当时仅有REDIS和MYSQL的时候,果断就选择从REDIS下手。由于是第一次写这种技术方面的文章,可能写的比较草,就算是抛砖引玉吧。有什么不足的地方请大家多多指正。

转载请注明出处:http://blog.csdn.net/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脚本

如果你看到了上面的这一段脚本,你应该就会明白我的意思了。Redis在sorted set中插入元素的时候,如果所插入的元素的score值相等,那么它将会按照alphabetical的顺序插入元素。沿用这种sorted set特性:

这里写图片描述

这种结构,可以让我们比较轻松地实现对geohash的前缀搜索。

当我们需要搜索详细内容如uvxe下面的条目的时候

Created with Raphaël 2.1.0 Start zrank查询uv5e*的rank值 rank存在? zrange(rank + 1, rank + 1)查询到具体条目uvxe-[{\"uid\":999}]并解析结果 解析结果
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值