Search code examples
javaredisgisjedis

Fetch all unique scores from a stored set with Redis?


To add geo data following code is used

jedis.geoadd("storegeodata", 51.5074, 0.1278, "London");
//while member string is mostly json 
jedis.geoadd("storegeodata", 51.5074, 0.1278, "{place: London}");
jedis.geoadd("storegeodata", 51.5074, 0.1278, "{place: London, lat: 51.5074, lon: 0.1278}");

While geohash is duplicated as member string is different , how to retrieve unique geohash based value avoiding redundancy

public Map<String, Object> checkRedisGeo(double lat, double lon, Jedis j) {
    Map<String, Object> result = new HashMap<>();
    try
    {
        GeoRadiusParam param = GeoRadiusParam.geoRadiusParam();
        param.sortAscending();
        param.withDist();
        param.count(1);
        System.out.println("lat :"+lat+" , lon :"+lon);
        List<GeoRadiusResponse> response =  j.georadius("commander",
                lon,lat, 150, GeoUnit.M, param);    
        //System.out.println(response.size()+" size");
      if(response.size() > 0)
      {
          for (GeoRadiusResponse geoRadiusResponse : response) {
                System.out.println("lat :"+lat+" , lon :"+lon+",  stringmember :"+geoRadiusResponse.getMemberByString());
                //System.out.println(geoRadiusResponse.getDistance());
                Object[] data= {geoRadiusResponse.getMemberByString()};
                System.out.println(data);
                result.put("result", data);
        
               }
      }else {
         // sendEvents(streamEvent, null, streamEventChunk);
          System.out.println("E");
      }
      
    } catch (Exception e) {
        LOGGER.error("checkRedisGeo err : "+e);
    }
      
  return result;
    
}

Which retrieves result but how to filter out based on geohash / score value ,how to get all distinct score ?

Following is the sample redundant data enter image description here


Solution

  • Was able to get duplicates and unique scores by comparing the score as the score is unique and multiple members are stored for same score following was the code for the same

        Double previous_score = 0.0;
        int DuplincatesCount = 0;
        int UniqueCount = 0;
        Set<String> values = jedis.zrange("rediskey", 0, -1);// get all the members
        for (String member : values) {
            Double current_score = jedis.zscore("rediskey", member);//each member looped
            if (Double.compare(current_score, previous_score) == 0) { //comparing current score with previous
                                                                        // score
                DuplincatesCount++;
            } else {
                UniqueCount++;
            }
            previous_score = current_score;// score mapping
        }
        System.out.println("Duplincates entry " + DuplincatesCount);
        System.out.println("Unique entry " + UniqueCount);