数据结构
Redis无论什么数据类型,存储的时候都是以键值对key-value形势存储,并且所有的key都是String类型,本文讨论的数据类型是value的数据类型。
GEO
概述:Redis GEO是Redis在3.2版本中新添加的特性,可以将经纬度格式的地理坐标存储到Redis中,并对这些坐标执行距离计算、范围查找等操作。
GEO常用命令:
命令 | 描述 |
---|---|
geoadd key longitude1 latitude1 member1 … | 向key中添加指定的地理位置:经度、纬度、位置名称 ,支持批量操作 |
geopos key member1 member2… | 查询key中指定元素的经纬度数据,支持批量操作 |
geodist key member1 member2… [m | km |
georadius key longitude latitude radius [m | km |
georadiusbymember key member radius [m | km |
geohash key member1 member2… | 获取指定key中一个或多个member 的hash值 |
GEO实现原理:
GEO的数据结构是geohash,使用geohash将二维的经纬度数据编码成一维数据,再使用B树索引快速查找出需要的数据。
GEO存储结构:
GEO底层采用Sorted Set来实现,key存储元素信息,value存储经纬度信息(scroe:分数),支持按经纬度排序、按范围查找等。
GEO哈希编码:
由于经纬度由经度和纬度组成,而Sorted Set中的value值是float类型,则需要把经纬度最终转换为一个value值,需要对经纬度进行编码,GEO哈希编码的实现原理就是分别对经度和纬度进行编码,再将经纬度的编码合成一个最终的编码,将最终生成的编码值存入value。
GEO的应用场景:
- 附近的人地点:各类社交软件附近的人,附近的商超、景点都可以可以通过Redis GEO快速实现。
- 外卖配送服务:通过地址的经纬度信息,可以找到距离最近的配送员或仓库,实现对订单的合理分配。
GEO主要用于存储地理位置信息,并对存储的信息进行操作,凡是跟地理位置相关的业务场景,都可以尝试用GEO来解决。
如有不正确的地方请各位指出纠正。