如何使用 java 从单个 Redis 键获取所有地理记录 (Jedis)

How to get all Geo records from single Redis key using java (Jedis)

如何获取与键相关联的所有地理记录?我能够将数据推送到 Redis 并使用

基于 [lon,lat,buffer] 进行检索
jedis.georadius(key, lon,lat, radius, GeoUnit.KM,GeoRadiusParam.geoRadiusParam().withCoord()); 

有什么办法可以单独使用key获取所有记录吗?以下是我用来使用 geobuffer 从 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;
}

在推送时我正在使用

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

试图单独从键(apicache)获取所有记录

地理数据作为排序集存储到键中。因此,您可以使用 jedis.zrange 获取所有点,但返回的值是地理格式。

要获取所有带坐标的记录,只需给出整个地球值,如下所示 jedis.georadius.,

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

它将return所有有坐标的记录。但是,您不能使用它来订购位置。

能够通过键获取所有值(将值存储为 json 带有经纬度映射的字符串,因此每个 return 来自 zrange return 没有几何的值能够得到经纬度也

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 所说,这只会获得价值,这个想法是映射经纬度并存储为 json,这样我们也可以通过键获得经纬度。(谢谢@Praga_t)