redis实现附近的人,但jedis中没有相关api,那么直接使用lua脚本执行。

redis实现附近的人,但jedis中没有相关api,那么直接使用lua脚本执行。
相关方法如下:

package com.way;

import java.util.List;

import redis.clients.jedis.Jedis;

/***
 * geo测试
 * (位置的服务)
 * 
 * jedis没有提供api,但可以使用lua脚本执行 jedis命令
 * @author wangany
 *
 */
public class JedisGEOTest {

    private Jedis jedis;

    public JedisGEOTest() {
        jedis = JedisPoolUtil.getJedis();
    }
    //

    public static void main(String[] args) throws Exception {
        JedisGEOTest jedisGEOTest = new JedisGEOTest();
        jedisGEOTest.geoADD("beijing", 116.312014, 39.963019,"haidian");
        jedisGEOTest.geoADD("beijing", 116.227501, 39.90858,"shijingshan");
        jedisGEOTest.geoADD("beijing", 116.297641, 39.861631,"fengtai");
        jedisGEOTest.geoADD("beijing", 116.428146, 39.9316,"dongcheng");
        jedisGEOTest.geoADD("beijing", 116.375829, 39.920091,"xicheng");
        jedisGEOTest.geoADD("beijing", 116.110793, 39.943992,"mentougou");
        jedisGEOTest.geoADD("beijing", 116.480464, 39.95948,"caoyang");
        jedisGEOTest.geoADD("beijing", 116.663862, 39.916107,"tongzhou");
        jedisGEOTest.geoADD("beijing", 116.349383, 39.729911,"daxing");
        jedisGEOTest.geoADD("beijing", 116.157361, 39.748109,"fangshan");
        jedisGEOTest.geoADD("beijing", 116.662137, 40.134017,"sunyi");
        jedisGEOTest.geoADD("beijing", 116.2367, 40.224862,"changping");
        jedisGEOTest.geoADD("beijing", 117.141617, 40.14196,"pinggu");
        jedisGEOTest.geoADD("beijing", 116.64144, 40.316466,"huairou");


         //某成员的坐标
         System.out.println(jedisGEOTest.geoPos("beijing","haidian"));
         //两成员之间的距离
         System.out.println(jedisGEOTest.geoDist("beijing","haidian","shijingshan","km"));
         //附近的成员
         System.out.println(jedisGEOTest.geoNearByMembersByDistance("beijing","dongcheng",10,"km",true));


         System.out.println(jedisGEOTest.geoRadius("beijing",116.421822, 39.906809,10,"km",false));
         System.out.println(jedisGEOTest.geoHash("beijing","haidian"));
    }
    /**
     * 添加geo
     * @param key 
     * @param longitude
     * @param latitude
     * @param name 位置名称
     * @return
     */
    public  Long geoADD(String key,double longitude,double latitude,String eleName){
        String[] params = new String[]{key,String.valueOf(longitude),String.valueOf(latitude),eleName};
        int keyCount = 4;
        return (Long)jedis.eval("return redis.call('GEOADD',KEYS[1],KEYS[2],KEYS[3],KEYS[4])", keyCount,params);
    }

    /**
     * 查询2位置距离
     * @param key
     * @param d1
     * @param d2
     * @param unit
     * @return
     */
    public  Double geoDist(String key,String d1,String d2,String unit){
        return Double.valueOf((String)jedis.eval("return redis.call('GEODIST',KEYS[1],KEYS[2],KEYS[3],KEYS[4])",4, key,d1,d2,unit));
    }

    /**
     * 查询位置的geohash
     * @param key
     * @param dName
     * @return
     */
    public  String geoHash(String key,String dName){

         Object data = jedis.eval("return redis.call('GEOHASH',KEYS[1],KEYS[2])", 2, new String[]{key,dName});//GEOPOS 也可以?
          List resultList = (List)data;
          if(resultList!=null&&resultList.size() > 0){
              return (String)resultList.get(0);
          }
          return null;
    }

    /**
     * 查询位置坐标
     * @param key
     * @param dName
     * @return
     */
    public  List geoPos(String key,String dName){
         Object data = jedis.eval("return redis.call('GEOPOS',KEYS[1],KEYS[2])", 2, key,dName);
          List resultList = (List)data;
          if(resultList!=null&&resultList.size() > 0){
              return resultList.get(0);
          }
          return null;
    }

    /**
     * 查询附近坐标地址
     * @param key
     * @param longitude
     * @param latitude
     * @param unit
     * @param asc
     * @return
     */
    public  List geoRadius(String key,double longitude,double latitude,int radius,String unit,boolean asc){
         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),
                 String.valueOf(latitude),String.valueOf(radius),unit,asc?"ASC":"DESC");
          return (List)data;
    }

    /**
     * 附近的成员们,根据距离
     * 
     * 根据位置查询附近点
     * @param key
     * @param dName
     * @param unit
     * @param asc
     * @return
     */
    public  List geoNearByMembersByDistance(String key,String dName,int radius,String unit,boolean asc){
         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");
         return (List)data;
    }

}

执行结果如下:

[116.31201177835464478, 39.96301832913440677]
9.4133
[dongcheng, xicheng, caoyang]
[caoyang, xicheng, dongcheng]
wx4eqepc6q0

你可能感兴趣的:(redis实现附近的人,但jedis中没有相关api,那么直接使用lua脚本执行。)