Redis Geo实现地理位置检索功能

 更新时间:2026年07月16日 09:07:43   作者:暮色之狐  
在Redis中,GEO(Geospatial)功能允许你存储地理位置信息,并对这些信息进行各种空间查询,本文给大家介绍Redis Geo实现地理位置检索功能,感兴趣的朋友跟随小编一起看看吧

做业务开发时,我们经常遇到这类需求:

✅ 同城筛选附近门店、外卖骑手匹配
✅ 社交APP附近的人、同城动态
✅ 网约车就近派单、地理位置打卡

面对这些地理位置检索场景,无需引入笨重的专业GIS引擎,Redis自带的GEO地理空间索引是一个轻量、高性能的方案。

Redis Geo

Redis Geo 没有创造新结构,完全基于有序集合 Sorted Set(ZSet)实现,底层核心组合:GeoHash 编码 + Sorted Set 索引。
简单来说就是:把二维的经纬度坐标,通过算法压缩成一维整数分值,利用ZSet天然的排序、范围检索能力,实现高效的地理位置查询。

  • Key:地理集合名(如 stores:location 门店位置集合)
  • Member:位置唯一标识(店铺ID、用户ID、设备ID)
  • Score:经纬度编码后的52位GeoHash整数(排序、检索的核心)

GeoHash 编码

GeoHash的核心价值:将二维经纬度,转化为可排序、可比对的一维字符串。
相近的地理位置,会拥有高度相似的编码前缀,这也是“附近查询”能够高效实现的根本原因。

GeoHash编码流程:

  1. 区间划分:针对地球经度范围[-180, 180]与纬度范围[-90, 90],开展持续的二分操作
  2. 二进制编码:在每次二分过程中,依据目标点所处区间(左区间记为0,右区间记为1)生成对应的二进制位,且经度与纬度的编码过程交替进行
  3. Base32编码:将生成的二进制数据流,按每5位为一组转换为Base32字符

核心命令

命令作用
GEOADD key longitude latitude member [...]添加一个或多个地理位置
GEOPOS key member [...]获取指定成员的经纬度信息
GEODIST key member1 member2 [unit]计算两个成员之间的直线距离
GEOHASH key member [...]获取成员对应的GeoHash编码,主要用于调试场景
GEOSEARCH key FROMMEMBER member BYRADIUS radius unit [...]以已存储的成员为中心,检索指定圆形区域内的位置
GEOSEARCH key FROMLONLAT lng lat BYRADIUS radius unit [...]以给定的经纬度为中心,检索指定圆形区域内的位置
GEOSEARCH key FROMLONLAT lng lat BYBOX width height unit [...]检索指定矩形区域内的位置
GEORADIUS key FROMLONLAT lng lat BYBOX width height unit [...]检索指定矩形区域内的位置,该命令已废弃

实战演练:实现「附近店铺」功能

将店铺位置录入Redis

将店铺的经纬度信息添加至Redis数据库

GEOADD storeId:location 116.48 39.95 store:1001
GEOADD storeId:location 116.50 39.96 store:1002
GEOADD storeId:location 116.30 39.90 store:1003

💡 该操作支持批量添加,可一次性录入多个位置信息,能有效提升操作性能。

检索附近的店铺

当用户A位于(116.48, 39.95)时,若需查询5公里范围内的店铺,可执行如下操作:

GEOSEARCH storeId:location \
FROMLONLAT 116.48 39.95 \ # 以指定经纬度为中心
BYRADIUS 5 km \ # 搜索半径5公里
WITHDIST \ # 返回距离中心点的距离
WITHCOORD \ # 返回目标的经纬度
COUNT 20 ASC # 最多20条,由近及远排序
## Redis 6.2 以下旧版本,可使用以下命令
GEORADIUS storeId:location 116.48 39.95 5 km WITHCOORD

Java代码

@Service
public class LocationService {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    private static final String GEO_KEY = "storeId:location";
    public void updateLocation(Long storeId, double lng, double lat) {
        // 先删旧位置,再添加新位置
        redisTemplate.opsForGeo().remove(GEO_KEY, storeId.toString());
        redisTemplate.opsForGeo().add(GEO_KEY, new Point(lng, lat), storeId.toString());
    }
    public GeoResults<RedisGeoCommands.GeoLocation<String>> 
            findNearby(double lng, double lat, double radius) {
        Circle circle = new Circle(new Point(lng, lat), 
                                   new Distance(radius, Metrics.KILOMETERS));
        return redisTemplate.opsForGeo().radius(GEO_KEY, circle,
            RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
                .includeDistance()
                .includeCoordinates()
                .sortAscending()
                .limit(20));
    }
}

到此这篇关于Redis Geo实现地理位置检索功能的文章就介绍到这了,更多相关Redis Geo位置检索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • shell脚本批量导出redis key-value方式

    shell脚本批量导出redis key-value方式

    为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CNT和INTERVAL参数控制负载,且scan不指定游标可减少阻塞
    2025-08-08
  • Redis模糊查询的几种实现方法

    Redis模糊查询的几种实现方法

    本文主要介绍了Redis模糊查询的几种实现方法,包括两种方法KEYS , SCAN,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Redis缓存的大小合理配置的实现示例

    Redis缓存的大小合理配置的实现示例

    合理配置Redis缓存大小是确保系统性能和稳定性的关键,本文就来详细的介绍一下Redis缓存的大小合理配置的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-10-10
  • Fastadmin中使用Redis的实现方法

    Fastadmin中使用Redis的实现方法

    在Fastadmin框架中使用Redis很简单,是基于thinkphp框架的操作方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05
  • redis sentinel监控高可用集群实现的配置步骤

    redis sentinel监控高可用集群实现的配置步骤

    这篇文章主要介绍了redis sentinel监控高可用集群实现的配置步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Redis之sql缓存的具体使用

    Redis之sql缓存的具体使用

    本文主要介绍了Redis之sql缓存的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • redis分布式Jedis类型转换的异常深入研究

    redis分布式Jedis类型转换的异常深入研究

    这篇文章主要介绍了redis分布式Jedis类型转换的异常深入研究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Redis生成分布式系统全局唯一ID的实现

    Redis生成分布式系统全局唯一ID的实现

    在互联网系统中,并发越大的系统,数据就越大,数据越大就越需要分布式,本文主要介绍了Redis生成分布式系统全局唯一ID的实现,感兴趣的可以了解一下
    2021-10-10
  • php安装redis扩展过程介绍

    php安装redis扩展过程介绍

    大家好,本篇文章主要讲的是php安装redis扩展过程介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 浅谈Redis分布式锁的几个坑

    浅谈Redis分布式锁的几个坑

    在分布式系统中,多个节点对共享资源的并发访问是常见场景,而分布式锁是保证资源访问互斥性、维护数据一致性的核心机制,本文就来详细的介绍一下Redis分布式锁的几个坑,感兴趣的可以了解一下
    2026-02-02

最新评论