1、使用的Redis客户端为:ServiceStack.Redis
2、Redis 中的 GEO
Redis是我们最为熟悉的K-V数据库,它常被拿来作为高性能的缓存数据库来使用,大部分项目都会用到它。从3.2版本开始它开始提供了GEO能力,用来实现诸如附近位置(e.g.某小区附近的篮球场 )、计算距离等这类依赖于地理位置信息的功能。
本次实例Demo中用到的GEO命令有:
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 }