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