从redisTemplate获取redis中的整个数据

时间:2015-11-25 10:45:35

标签: java spring-mvc redis

我对redis比较陌生。 我正在设计一个rest API,以便在redis db中获取整个数据集。

我使用以下代码获取所有密钥

public Map 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();
    } 
}

我能够获得所有密钥,但无法检索所有密钥的值。以下是方法             &#34;对象值= redisService.getTemplate()。opsForValue()。get(&#34;&#34;);&#34;

我想这是因为某些键具有不同的数据类型。

如果我必须修改/更改我的方法,请告诉我。

2 个答案:

答案 0 :(得分:1)

不应在生产中使用第一个。相反,您可以使用 scan 命令。

获得密钥后,您可以调用redis type 命令,以检索对象的DataType。

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

然后你可以调用正确的函数来获取数据

在大型数据集上,这可能需要一段时间。你确定你需要休息api需要将所有数据都放入redis吗?您可以使用扫描模式仅检索您真正需要的数据。

答案 1 :(得分: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();
    }