当前位置: 首页 > 知识库问答 >
问题:

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

蔺翰音
2023-03-14

如何获取与密钥关联的所有地理记录?我能够将数据推送到Redis中,并使用[lon、lat、buffer]进行检索

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

有没有办法单独使用密钥获取所有记录?下面是我使用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);

共有2个答案

壤驷兴朝
2023-03-14

能够通过键获取所有值(存储值为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)

金谭三
2023-03-14

地理数据以排序集的形式存储到密钥中。因此你可以使用绝地武士。zrange用于获取所有点,但重新运行的值为geo格式。

要获得所有坐标记录,只需在绝地中给出整个地球的值。乔拉迪厄斯。,

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

它将返回所有带有坐标的记录。但是,您不能使用此命令来订购位置。

 类似资料:
  • 问题内容: 是否有Redis命令用于获取数据库中的所有密钥?我已经看到一些python-redis库正在获取它们。但是我想知道从redis-client是否有可能。 问题答案: 尝试看一下命令。将列出存储在redis中的所有密钥。 编辑: 请注意文档页面顶部的警告: 时间复杂度: O(N),其中N为数据库中密钥的数目,假设数据库中的密钥名称和给定模式的长度有限。 UPDATE(V2.8或更高版本)

  • 问题内容: Aerospike客户端具有scanAll方法,可从其存储中读取所有行。我在以下代码中使用它: 但这已完成,因为userKey为null。所有其他字段均有效。用户密钥是Long值,用于保存数据: 一切都很好,如果我这样发出单个请求: 有什么问题吗?为什么userKey为null? 问题答案: Aerospike使用密钥和设置名称来生成唯一的摘要,因此它仅存储摘要。 如果插入一条记录(如

  • 问题内容: 我正在尝试使用Java API从Elasticsearch获取所有记录。但我收到以下错误 n [[Wild Thing] [localhost:9300] [indices:data / read / search [phase / dfs]]]; 嵌套:QueryPhaseExecutionException [结果窗口太大,从+大小必须小于或等于:[10000],但为[10101]

  • 我正在尝试使用Java API从Elasticsearch中获取所有记录。但我收到以下错误 N[[Wild Thing][localhost:9300][索引:数据/读取/搜索[Phase/DFS]]];嵌套:QueryPhaseExecutionException[结果窗口太大,from+size必须小于或等于:[10000]但为[10101]。 我的代码如下所示 当前存在的记录总数为13188

  • 我有一个redis缓存数据库,可以保存80k条记录。我需要在我的应用程序中获取整个数据(键和值)。我使用的是绝地武士客户端,下面是我使用的代码: 以上代码有效。我得到了80k个密钥,它循环遍历每个密钥以获得值,哈希映射用密钥和值填充。我还没有在这里添加迭代器的代码,我认为这与我的问题无关,但如果需要,我可以添加它。 我的问题是性能,这需要很长时间(

  • 问题内容: 当我的密钥在Redis数据存储区中过期时,我正在尝试使用Redis实施过期密钥通知。redis网站提供了一些有关http://redis.io/topics/notifications的描述,但是我无法找到任何示例,例如使用Jedis的redis java客户端如何做到这一点? 任何可能的带有插图的代码都将非常有用,因为它们是redis的新功能。 问题答案: 您只能使用 pub-sub