面试题答案
一键面试Redis数据结构设计思路
- 使用Sorted Set:Sorted Set非常适合存储地理位置相关数据,它以
(member, score)
的形式存储数据,我们可以将经纬度信息编码后作为member
,并根据需求设置合适的score
,例如可以将某个与地理位置相关的索引值作为score
。 - Geospatial Indexing(地理空间索引):Redis 3.2 版本后引入了 GEO 相关命令,这对于处理地理位置数据更为方便。可以使用 GEOADD 命令将地理位置信息添加到 Redis 中,GEO 数据在 Redis 内部也是以 Sorted Set 来实现的。
相关操作命令
- 添加数据(使用GEOADD):
例如,如果 MySQL 表中有一条记录,经纬度分别为GEOADD key longitude latitude member [longitude latitude member ...]
116.4074
(经度),39.9042
(纬度),地点名称为beijing
,则可以这样添加到 Redis 中:GEOADD location:area 116.4074 39.9042 beijing
- 按区域范围查询(使用GEORADIUS):
例如,查询以GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
116.4074
为经度,39.9042
为纬度,半径为 10km 的区域内的所有地点,并返回地点的距离和坐标:GEORADIUS location:area 116.4074 39.9042 10 km WITHCOORD WITHDIST
- 如果不使用GEO命令(使用Sorted Set):
- 添加数据:
首先要将经纬度编码成唯一的字符串作为
member
,比如使用longitude:latitude
的格式。然后可以选择一个索引值作为score
,例如可以根据地理位置的某种优先级或者按照插入顺序生成一个递增的数字作为score
。ZADD location:area 1 "116.4074:39.9042"
- 按区域范围查询:这就需要自己实现一个范围查询逻辑,首先要根据经纬度范围计算出对应的
member
范围,然后使用ZRANGEBYSCORE
命令来查询。ZRANGEBYSCORE location:area min_score max_score
- 添加数据:
首先要将经纬度编码成唯一的字符串作为