2015-11-25 62 views
0

我對redis來說比較新。 我正在設計一個rest API,以便在redis db中獲取整個數據集。從redis獲取redis中的全部數據

我用下面的代碼來獲取所有的按鍵

公共地圖getAllRedisData(){

Map<Object, Object> map = new HashMap<>(); 
    Set<byte[]> keys = redisService.getTemplate().getConnectionFactory().getConnection().keys("*".getBytes()); 
    Iterator<byte[]> it = keys.iterator(); 

    while(it.hasNext()){ 
     byte[] data = (byte[])it.next(); 
     // String key = new String(data,0,data.length); 
     Object key = null; 
     try { 
      key = getObjectFromByteArray(data); 
      System.out.println(key); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }  
    return map; 
} 

private Object getObjectFromByteArray(byte[] bytes) throws IOException, ClassNotFoundException 
{ 
    try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 
     ObjectInput in = new ObjectInputStream(bis)) { 
     return in.readObject(); 
    } 
} 

我能得到所有的鑰匙,但wasnt能夠檢索貨值均鍵。以下是方法 「Object value = redisService.getTemplate()。opsForValue()。get(」「);」

我想這是因爲一些鍵是不同的數據類型。

讓我知道是否必須修改/更改我的方法。

回答

0

第一個不應該用於生產。相反,您可以使用scan命令。

當您擁有密鑰時,您可以調用redis type命令來檢索該對象的DataType。

DataType -> NONE, STRING, LIST, SET, ZSET, HASH 

然後就可以調用正確的函數來獲取數據

在大的數據集,這可能需要一段時間。你確定你需要把所有的數據都放到redis中嗎?您可以使用掃描模式僅檢索您真正需要的數據。

0

我沒有測試它,但嘗試這個

try { 
     Object value = getObjectFromByteArray(redisService.getTemplate().getConnectionFactory().getConnection().get(data)); 
     key = getObjectFromByteArray(data); 
     System.out.println(key); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }