Как получить все географические записи из одного ключа Redis, используя java (Jedis) - PullRequest
0 голосов
/ 09 июля 2020

Как связать все географические записи с ключом? Я могу поместить sh данные в Redis и получить их на основе [lon, lat, buffer], используя

jedis.georadius(key, lon,lat, radius, GeoUnit.KM,GeoRadiusParam.geoRadiusParam().withCoord()); 

Есть ли способ получить все записи, используя только ключ? Ниже приведен код, который я использовал для извлечения записей из redis с помощью геобуфера.

public Map<String, Object> getFromRedis(String key, Double lat, Double lon, Integer radii, Integer resultCount,  boolean hasType, String typekey) {
    Map<String, Object> result = new HashMap<>();
    ArrayList<Map<String,Object>> geoObj= new ArrayList<>();

    boolean gotresult = false;
    try(Jedis jedis=new Jedis("localhost",6379);)
    {
        
        GeoRadiusParam param = GeoRadiusParam.geoRadiusParam();
        param.sortAscending();
        param.withDist();
        param.count(resultCount);
        List<GeoRadiusResponse> response;
        response =  jedis.georadius(key,lat,lon, radii, GeoUnit.M, param);//redis zset key, lon,lat,radii,..
          if(response.size() > 0)
          {
              for (GeoRadiusResponse geoRadiusResponse : response) {
                    Map<String, Object> resultObj = new HashMap<>();
                    Object[] data= {geoRadiusResponse.getMemberByString()};
                    LOGGER.info("Got Result from Redis Server :: "+data);
                    gotresult = true;
                        for(Object o : data)
                        {
                            JSONObject jObject = new JSONObject(o.toString());
                            Iterator<?> keys = jObject.keys();
                            while( keys.hasNext() ){
                                String keyObj = (String)keys.next();
                                String value = jObject.getString(keyObj); 
                                resultObj.put(keyObj, value);
                            }
                            LOGGER.info("Fetched Value : "+resultObj);
                            geoObj.add(resultObj);
                        }
                   }
                result.put("result", geoObj);
          }
          else {
                LOGGER.info("Unable to find matching result in Redis server");
          }
    } catch (Exception e) {
        LOGGER.error("Redis Fetch result failed");
        LOGGER.error("Error : "+e);
    }
    result.put("status", gotresult);
    return result;
}

В то время как для pu sh я использую

jedis.geoadd(key, lon, lat, String);

Пытаюсь получить все записи для получения из только ключ (apicache) введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Смог получить все значения по ключу (сохраненное значение как json строка с отображением lat long, поэтому при каждом возврате из zrange возвращаемое значение без геометрии также могло получить lat lon

try(Jedis jedis=new Jedis("localhost",6379);) {
Set<String> values =  jedis.zrange(Key, 0, -1);//key, start , end        
 for (String  recordvalue : values) {
                System.out.println(recordvalue);//HashMap<String, Object> map = new Gson().fromJson(recordvalue .toString(), HashMap.class);
            }
 }
} catch (Exception e) {
        LOGGER.error(e);
}

Но, как сказал Praga_t, это просто получит значение, идея состоит в том, чтобы отобразить lat lon и сохранить как json, чтобы по ключу мы также могли получить с ним latlong. (Спасибо @Praga_t)

1 голос
/ 09 июля 2020

Геоданные хранятся в ключе в виде отсортированного набора. Следовательно, вы можете использовать jedis.zrange для получения всех точек, но возвращаемое значение находится в географическом формате.

Чтобы получить все записи с координатами, просто укажите полное земное значение, как показано в jedis.georadius.,

lat = 0
lon = 0  
radii = 22000  
param = withCoord

Он вернет все записи с координатами. Однако вы не можете упорядочить местоположения, используя это.

...