redis(3.2及以上) GEO 的相关命令如下

GEOADD 每次可以添加一个或多个经纬度地理位置

GEOADD key [longitude latitude name ...]

GEOPOS 输入位置的名字并取得位置的具体经纬度

GEOADD key [name ...]

GEODIST 计算两个位置之间的距离

GEODIST key name_a name_b [unit(m,km,mi,ft)]

可选参数 unit 用于指定计算距离时的单位

GEORADIUSBYMEMBER|GEORADIUS 获取指定范围内的元素

GEORADIUSBYMEMBER key name radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [count]
GEORADIUS location-setlongitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [count]

m|km|ft|mi 指定的是计算范围时的单位;
如果给定了可选的 WITHCOORD , 那么命令在返回匹配的位置时会将位置的经纬度一并返回;
如果给定了可选的 WITHDIST , 那么命令在返回匹配的位置时会将位置与中心点之间的距离一并返回;
在默认情况下, GEORADIUS 和 GEORADIUSBYMEMBER 的结果是未排序的, ASC 可以让查找结果根据距离从近到远排序, 而 DESC 则可以让查找结果根据从远到近排序;
count 参数指定要返回的结果数量

使用 .Net 的话,通过 StackExchange.Redis 调用其函数,亦可实现(RedisHelper 点击下载

        RedisHelper.cs
        //添加地理位置信息
        public bool GeoAdd(RedisKey key, double longitude, double latitude, RedisValue value)
        {
            key = AddKeyPrefix(key);
            return _db.GeoAdd(key, longitude, latitude, value);
        }

        //获取两地址的距离
        public double GeoDistance(RedisKey key, RedisValue valueA, RedisValue valueB, GeoUnit unit)
        {
            return (double)_db.GeoDistance(key, valueA, valueB, unit);
        }

        //获取该地理位置附近的其他位置信息
        public GeoRadiusResult[] GeoRadius(RedisKey key, RedisValue value, double radius, GeoUnit unit,int count)
        {
            return _db.GeoRadius(key, value, radius, unit, count);
        }

        public GeoRadiusResult[] GeoRadius(RedisKey key, double longitude, double latitude, double radius, GeoUnit unit, int count)
        {
            return _db.GeoRadius(key, longitude, latitude, radius, unit, count);
        }

使用的时候

        HomeController.cs

        RedisHelper redis = new RedisHelper(0);

        //添加城市坐标信息
        public bool GeoAdd()
        {
            return redis.GeoAdd("Guangdong", 113.082275, 22.563293, "Jiangmen");
        }

        //获取两个城市的距离
        public double GeoDistinct()
        {
            return redis.GeoDistance("Guangdong", "Jiangmen", "Shenzhen", GeoUnit.Kilometers);
        }

        //获取广州周围200km距离的城市
        public string GeoRadius()
        {
            string str = "";
            GeoRadiusResult[] results;

            results = redis.GeoRadius("Guangdong", "Guangzhou", 200, GeoUnit.Kilometers, 10);
            foreach (var item in results)
            {
                str += item.Member.ToString() + "-" + item.Position.Value + "-" + item.Distance + "km" + "|";
            }
            return str;
        }