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とEXPIREに関連するバグがあった可能性は十分にあります。その場合、クライアントライブラリが補正できることはあまりありません。

2.0よりも「最新の」ビルドのredis-serverを使用することを強くお勧めします。利用できない場合は、dmajkicバイナリ(2.4.5に移行)または[MSOpenTech] * https://github.com/MSOpenTech/redis)ソースを試してみてください。でも!!!これはローカルデバッグ用です。現時点での本番作業(つまり、MSOpenTechコードが満足できるまで)には、Linuxサーバーを使用してredisをホストすることをお勧めします。UbuntuServerはうまく機能します。

于 2012-05-31T05:40:49.317 に答える