1

首先,如果我的概念有误,请原谅,这对我来说有点新。我必须从 webdis 服务器检索一些对象。目前的做法是:

  1. 获取所有对象 id (serverUrl/ZRANGE/objects_index/-X/-1)
  2. 对于每个对象,获取属性(serverUrl/GET/attributeY_objectIdX)

因此,如果我有具有 Y 属性的 X 对象,我必须执行 X * Y + 1 REST 调用来获取所有数据,这似乎效率很低。

据我了解, Multi是执行连接的命令,但 webdis rest api 不支持(请参阅想法,webdis页面上的 TODO)。

我缺少一个更简单的解决方案吗?

我应该重新组织数据的存储方式吗?

我可以使用 websockets 通过 json 发送 MULTI/EXEC 命令吗:

jsonSocket.send(JSON.stringify(["MULTI", "EXEC", "GET", "etc..."]));
4

1 回答 1

1

首先,您应该考虑使用散列对象,而不是每个属性有一个键,这样每个对象都有一个键,与多个属性相关联。好处是您可以使用 HGETALL 命令一次检索给定对象的所有属性。您只有 X+1,而不是 X*Y+1 调用。

代替:

SET user:1:name    Didier
SET user:1:age     41
SET user:1:country FR

你可以有:

HMSET user:1 name Didier age 41 country FR

然后,webdis 支持 HTTP 1.1 和 websocket 流水线,Redis 服务器支持使用自己的协议进行流水线。因此应该可以向 webdis 发送多个命令,等待结果(将以相同的顺序返回),同时只需支付单次往返费用。

例如,webdis 页面上提供的 websocket 示例实际上执行了一次往返来执行两个命令:

var jsonSocket = new WebSocket("ws://127.0.0.1:7379/.json");
jsonSocket.onopen = function() {

    console.log("JSON socket connected!");
    jsonSocket.send(JSON.stringify(["SET", "hello", "world"]));
    jsonSocket.send(JSON.stringify(["GET", "hello"]));
};
jsonSocket.onmessage = function(messageEvent) {
    console.log("JSON received:", messageEvent.data);
};

您可以做类似的事情,并聚合几个 HGETALL 命令以按批次 n 个对象检索数据。

请注意,对于 Redis 本身(即没有 webdis),我可能会推荐相同的策略(流水线 HGETALL 命令)。

于 2013-08-13T17:56:52.723 回答