1. 程式人生 > 實用技巧 >基於.Net Core的Redis實現查詢附近的地理資訊

基於.Net Core的Redis實現查詢附近的地理資訊

1、使用的Redis客戶端為:ServiceStack.Redis

2、Redis 中的 GEO
Redis是我們最為熟悉的K-V資料庫,它常被拿來作為高效能的快取資料庫來使用,大部分專案都會用到它。從3.2版本開始它開始提供了GEO能力,用來實現諸如附近位置(e.g.某小區附近的籃球場 )、計算距離等這類依賴於地理位置資訊的功能。
本次例項Demo中用到的GEO命令有:

Redis命令 描述
GEOADD key longitude latitude member [longitude latitude member …] 將指定的地理空間位置(緯度、經度、名稱)新增到指定的 key 中
GEODIST key member1 member2 [unit] 返回兩個給定位置之間的距離
GEORADIUS key longitude latitude radius 以給定的經緯度為中心, 找出某一半徑內的元素

3、例項Demo

 1 using ServiceStack.Redis;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Text;
 5 
 6 namespace RedisDemo
 7 {
 8     class NearByDemo
 9     {
10 public static void Start() 11 { 12 var redisMangement = new RedisManagerPool("127.0.0.1:6379"); 13 var client = redisMangement.GetClient(); 14 15 //---寫入地理資訊--- 16 RedisGeo[] redisGeos = new RedisGeo[] 17 { 18 new
RedisGeo() 19 { 20 Longitude=117.12, 21 Latitude=39.08, 22 Member="tianjin" 23 }, 24 new RedisGeo() 25 { 26 Longitude=114.29, 27 Latitude=38.02, 28 Member="beijing" 29 } 30 }; 31 //GEOADD key longitude latitude member [longitude latitude member ...] 32 //summary: Add one or more geospatial items in the geospatial index represented using a sorted set 33 client.AddGeoMembers("geo", redisGeos); 34 35 //---獲取兩個地理位置之間的距離--- 36 //GEODIST key member1 member2 [unit] 37 //summary: Returns the distance between two members of a geospatial index 38 double distance = client.CalculateDistanceBetweenGeoMembers("geo", "tianjin", "beijing", "km"); 39 Console.WriteLine(distance); 40 41 //---獲取某城市方圓多少公里內的其他城市(狹義)--- 42 //GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 43 //summary: Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point 44 List<RedisGeoResult> geoResults = client.FindGeoResultsInRadius("geo", 115.03, 38.44, 200, "km"); 45 foreach (var item in geoResults) 46 { 47 Console.WriteLine($"{item.Member}--{item.Distance}--{item.Unit}"); 48 } 49 } 50 } 51 }
View Code