Redis GEO 测试

来源:互联网 发布:远光java面试题 编辑:程序博客网 时间:2024/04/26 18:31

http://blog.csdn.net/zhu_tianwei/article/details/49149699


关于Redis GEO介绍命令可以参考官方文档:http://redis.io/commands/geoadd

主要命令:

GEOADD  添加地理位置信息
GEODIST 查询位置距离
GEOHASH 查询位置GEOHASH编码
GEOPOS  查询位置的坐标
GEORADIUS  查询某点的附近点
GEORADIUSBYMEMBER  查询某位置距离的附近点

如果要演示redis GEO功能我们需要下载Unstable版本进行编译安装,可以在官网下载:http://redis.io/download或到github去下载最新Unstable版本代码编译:https://github.com/antirez/redis。

关于安装请参考:http://blog.csdn.net/zhu_tianwei/article/details/44890579

下面我们来演示一下命令:

1.添加位置信息

[plain] view plain copy
 print?
  1. 192.168.1.90:6379>   
  2. 192.168.1.90:6379> GEOADD Guangdong-cities 113.2099647 23.593675 Qingyuan  
  3. (integer) 1  
  4. 192.168.1.90:6379> GEOADD Guangdong-cities 113.2278442 23.1255978 Guangzhou 113.106308 23.0088312 Foshan 113.7943267 22.9761989 Dongguan 114.0538788 22.5551603 Shenzhen  
  5. (integer) 4  
  6. 192.168.1.90:6379>   
2.查询位置距离

[plain] view plain copy
 print?
  1. 192.168.1.90:6379> GEODIST Guangdong-cities Qingyuan Guangzhou km  
  2.   
  3. 192.168.1.90:6379>  
3.查询位置GEOHASH编码

[plain] view plain copy
 print?
  1. 192.168.1.90:6379> GEOHASH Guangdong-cities Qingyuan Guangzhou  
  2. 1) "ws0w0phgp70"  
  3. 2) "ws0e89curg0"  
  4. 192.168.1.90:6379>   
4.查询位置的坐标

[plain] view plain copy
 print?
  1. 192.168.1.90:6379> GEOPOS Guangdong-cities Qingyuan Guangzhou Foshan  
  2. 1) 1) "113.20996731519699"  
  3.    2) "23.593675019671288"  
  4. 2) 1) "113.22784155607224"  
  5.    2) "23.125598202060807"  
  6. 3) 1) "113.10631066560745"  
  7.    2) "23.008831202413539"  
  8. 192.168.1.90:6379>   
5.查询某点的附近点

[plain] view plain copy
 print?
  1. 192.168.1.90:6379> GEORADIUS Guangdong-cities  113.2278442 23.1255978 50 km asc  
  2. 1) "Guangzhou"  
  3. 2) "Foshan"  
  4. 192.168.1.90:6379>   
6.查询某位置距离的附近点

[plain] view plain copy
 print?
  1. 192.168.1.90:6379> GEORADIUSBYMEMBER Guangdong-cities Guangzhou 50 km asc  
  2. 1) "Guangzhou"  
  3. 2) "Foshan"  
  4. 192.168.1.90:6379>   

使用redis Java客户端jedis实例;

由于jedis并没有实现redis GEO的命令,测试使用lua脚本来实现:

[java] view plain copy
 print?
  1. package test;  
  2.   
  3. import java.util.List;  
  4.   
  5. import redis.clients.jedis.Jedis;  
  6.   
  7. public class Test {  
  8.     private static Jedis jedis = null;  
  9.     static{  
  10.         jedis = new Jedis("192.168.1.90"6379);  
  11.     }  
  12.   
  13.     public static void main(String[] args) throws Exception {  
  14.         System.out.println(geoADD("beijing"116.31201439.963019,"haidian"));  
  15.         System.out.println(geoADD("beijing"116.22750139.90858,"shijingshan"));  
  16.         System.out.println(geoADD("beijing"116.29764139.861631,"fengtai"));  
  17.         System.out.println(geoADD("beijing"116.42814639.9316,"dongcheng"));  
  18.         System.out.println(geoADD("beijing"116.37582939.920091,"xicheng"));  
  19.         System.out.println(geoADD("beijing"116.11079339.943992,"mentougou"));  
  20.         System.out.println(geoADD("beijing"116.48046439.95948,"caoyang"));  
  21.         System.out.println(geoADD("beijing"116.66386239.916107,"tongzhou"));  
  22.         System.out.println(geoADD("beijing"116.34938339.729911,"daxing"));  
  23.         System.out.println(geoADD("beijing"116.15736139.748109,"fangshan"));  
  24.         System.out.println(geoADD("beijing"116.66213740.134017,"sunyi"));  
  25.         System.out.println(geoADD("beijing"116.236740.224862,"changping"));  
  26.         System.out.println(geoADD("beijing"117.14161740.14196,"pinggu"));  
  27.         System.out.println(geoADD("beijing"116.6414440.316466,"huairou"));  
  28.           
  29.           
  30.          System.out.println(geoHash("beijing","haidian"));  
  31.          System.out.println(geoDist("beijing","haidian","shijingshan","km"));  
  32.          System.out.println(geoPos("beijing","haidian"));  
  33.          System.out.println(geoRadius("beijing",116.42182239.906809,10,"km",false));  
  34.          System.out.println(geoRadiusByMember("beijing","dongcheng",10,"km",true));  
  35.     }  
  36.     /** 
  37.      * 添加geo 
  38.      * @param key  
  39.      * @param longitude 
  40.      * @param latitude 
  41.      * @param name 位置名称 
  42.      * @return 
  43.      */  
  44.     public static Long geoADD(String key,double longitude,double latitude,String dName){  
  45.         return (Long)jedis.eval("return redis.call('GEOADD',KEYS[1],KEYS[2],KEYS[3],KEYS[4])"4,key,String.valueOf(longitude),String.valueOf(latitude),dName);  
  46.     }  
  47.       
  48.     /** 
  49.      * 查询2位置距离 
  50.      * @param key 
  51.      * @param d1 
  52.      * @param d2 
  53.      * @param unit 
  54.      * @return 
  55.      */  
  56.     public static Double geoDist(String key,String d1,String d2,String unit){  
  57.         return Double.valueOf((String)jedis.eval("return redis.call('GEODIST',KEYS[1],KEYS[2],KEYS[3],KEYS[4])",4, key,d1,d2,unit));  
  58.     }  
  59.       
  60.     /** 
  61.      * 查询位置的geohash 
  62.      * @param key 
  63.      * @param dName 
  64.      * @return 
  65.      */  
  66.     public static String geoHash(String key,String dName){  
  67.          Object data = jedis.eval("return redis.call('GEOHASH',KEYS[1],KEYS[2])"2, key,dName);  
  68.           List<String> resultList = (List<String>)data;  
  69.           if(resultList!=null&&resultList.size() > 0){  
  70.               return resultList.get(0);  
  71.           }  
  72.           return null;  
  73.     }  
  74.       
  75.     /** 
  76.      * 查询位置坐标 
  77.      * @param key 
  78.      * @param dName 
  79.      * @return 
  80.      */  
  81.     public static List<Double> geoPos(String key,String dName){  
  82.          Object data = jedis.eval("return redis.call('GEOPOS',KEYS[1],KEYS[2])"2, key,dName);  
  83.           List<List<Double>> resultList = (List<List<Double>>)data;  
  84.           if(resultList!=null&&resultList.size() > 0){  
  85.               return resultList.get(0);  
  86.           }  
  87.           return null;  
  88.     }  
  89.       
  90.     /** 
  91.      * 查询附近坐标地址 
  92.      * @param key 
  93.      * @param longitude 
  94.      * @param latitude 
  95.      * @param unit 
  96.      * @param asc 
  97.      * @return 
  98.      */  
  99.     public static List<String> geoRadius(String key,double longitude,double latitude,int radius,String unit,boolean asc){  
  100.          Object data = jedis.eval("return redis.call('GEORADIUS',KEYS[1],KEYS[2],KEYS[3],KEYS[4],KEYS[5],KEYS[6])"6, key,String.valueOf(longitude),  
  101.                  String.valueOf(latitude),String.valueOf(radius),unit,asc?"ASC":"DESC");  
  102.           return (List<String>)data;  
  103.     }  
  104.       
  105.     /** 
  106.      * 根据位置查询附近点 
  107.      * @param key 
  108.      * @param dName 
  109.      * @param unit 
  110.      * @param asc 
  111.      * @return 
  112.      */  
  113.     public static List<String> geoRadiusByMember(String key,String dName,int radius,String unit,boolean asc){  
  114.          Object data = jedis.eval("return redis.call('GEORADIUSBYMEMBER',KEYS[1],KEYS[2],KEYS[3],KEYS[4],KEYS[5])"5, key,dName,String.valueOf(radius),unit,asc?"ASC":"DESC");  
  115.          return (List<String>)data;  
  116.     }  
  117. }  

增加jar包依赖:

[html] view plain copy
 print?
  1. <dependency>  
  2.             <groupId>redis.clients</groupId>  
  3.             <artifactId>jedis</artifactId>  
  4.             <version>2.7.3</version>  
  5.         </dependency>  

参考文章:

1.redis官网lua脚本

2.spring+springdata redis入门教程实现java端调用redis lua脚本片段和lua脚本文件

3.利用redis + lua解决抢红包高并发的问题


0 0
原创粉丝点击