我对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;
我想这是因为某些键具有不同的数据类型。
如果我必须修改/更改我的方法,请告诉我。
答案 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();
}