Booksleeve - 设置多个哈希值并一次检索它们

时间:2012-05-30 23:10:34

标签: booksleeve

我正在尝试独立设置哈希的多个字段,并在以后立即检索它们。下面的代码是应该工作还是在这里做错了?当我在从服务堆栈站点下载的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();

1 个答案:

答案 0 :(得分: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和EXPIRE 相关的错误 - 在这种情况下,客户端库可以做很多补偿。

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