1

我正在尝试独立设置散列的多个字段并在以后一次全部检索它们。下面的代码应该工作还是在这里做错了什么?当我在从 Service Stack 站点下载的 Windows 上针对 redis-2.0.0-x64 在本地运行它时,task3 的结果将始终只包含 field2。

var con = RedisConnectionManager.Instance.GetConnection();
var key = "somekey1";

// set the field value and expiration
var task = con.Hashes.Set(1, key, "field1", token.ToByteArray())
    .ContinueWith((x)=> con.Keys.Expire(1, key, 7200));
task.Wait();

var task2 = con.Hashes.Set(1, key, "field2", "fooobar");
task2.Wait();

var task3 = con.Hashes.GetAll(1, key);
task3.Wait();
4

1 回答 1

1

无法在当前版本的 redis 上重现这一点 - 在这里看起来不错:

using (var con = Config.GetUnsecuredConnection())
{
    var key = "somekey1";

    // set the field value and expiration
    var task = con.Hashes.Set(1, key, "field1", Encoding.UTF8.GetBytes("hello world"))
        .ContinueWith((x) => con.Keys.Expire(1, key, 7200));
    task.Wait();

    var task2 = con.Hashes.Set(1, key, "field2", "fooobar");
    task2.Wait();

    var task3 = con.Hashes.GetAll(1, key);
    task3.Wait();

    Assert.AreEqual(2, task3.Result.Count);
    Assert.AreEqual("hello world", Encoding.UTF8.GetString(task3.Result["field1"]));
    Assert.AreEqual("fooobar", Encoding.UTF8.GetString(task3.Result["field2"]));
}

或者,更有效(使用流水线,不等待):

using (var con = Config.GetUnsecuredConnection())
{
    var key = "somekey1";

    // set the field value and expiration
    con.Hashes.Set(1, key, "field1", Encoding.UTF8.GetBytes("hello world"));
    con.Keys.Expire(1, key, 7200);
    con.Hashes.Set(1, key, "field2", "fooobar");
    var task = con.Hashes.GetAll(1, key);
    con.Wait(task);

    Assert.AreEqual(2, task.Result.Count);
    Assert.AreEqual("hello world", Encoding.UTF8.GetString(task.Result["field1"]));
    Assert.AreEqual("fooobar", Encoding.UTF8.GetString(task.Result["field2"]));
}

所以是的:应该工作,并且似乎工作。注意我在本地使用 2.4.5;2.0现在已经老了,并且有许多重要的错误。完全有可能在服务器上存在与 HSET plus EXPIRE 相关的错误- 在这种情况下,客户端库无法弥补。

强烈建议使用比 2.0 更“当前”的 redis-server 版本。如果一个不可用,您可能想尝试dmajkic二进制文件(转到 2.4.5)或 [MSOpenTech]*https://github.com/MSOpenTech/redis)源。然而!!!这仅用于本地调试。对于当前的生产工作(即直到 MSOpenTech 代码快乐-快乐),我建议使用 linux 服务器来托管 redis。Ubuntu 服务器运行良好。

于 2012-05-31T05:40:49.317 回答