4

一般的なことを見逃している可能性があります。申し訳ありません。しかし、私のテストでは、期限切れのキー (ハッシュ) の存在を確認すると、true が返されます。

ここで「キャッシュ」は IDatabase インスタンスです

// This will return true
var exists = cache.KeyExists(key);
// This will return null
var ttl = cache.KeyTimeToLive(key);
// This will return null
var fullWait = cache.HashGetAsync(key, "full", flags: CommandFlags.None);

また、When.NotExists で設定すると機能します。

cache.HashSetAsync(key, "full", value, When.NotExists, CommandFlags.PreferMaster);

アップデート:

@Marc_Gravell の回答は、テストで問題を見つけるのに役立ちました: 有効期限を短すぎる (~500 ミリ秒) に設定すると、この奇妙な動作が発生します。1秒または2秒に変更したとき、私のテストは今合格しています。

変更されたMarc の例では、これも発生します (有効期限を 400 ミリ秒に変更しました)。

[Test]
    public void Exec()
    {
        var key = "testKey";
        using (var conn = CreateConnection())
        {
            var cache = conn.GetDatabase();

            // setup some data
            cache.KeyDelete(key);

// cache.HashSet(key, "full", "some value"); // cache.KeyExpire(key, TimeSpan.FromSeconds(3));

            cache.HashSetAsync(key, "full", "some value", When.NotExists, CommandFlags.PreferMaster);
            cache.HashSetAsync(key, "last_accessesed", "some other data", When.NotExists, CommandFlags.PreferMaster);
            cache.KeyExpireAsync(key, DateTime.UtcNow.AddMilliseconds(400), CommandFlags.FireAndForget);



            // test while exists
            var exists = cache.KeyExists(key);
            var ttl = cache.KeyTimeToLive(key);
            var fullWait = cache.HashGetAsync(key, "full", flags: CommandFlags.None);
            Assert.IsTrue(exists, "key exists");
            Assert.IsNotNull(ttl, "ttl");
            Assert.AreEqual("some value", (string)fullWait.Result);

もたらす

  ttl
  Expected: not null
  But was:  null

更新 2:

このコードは昨日はうまくいきましたが、今はうまくいきません。

   private ConnectionMultiplexer CreateConnection()
    {
        ConnectionMultiplexer connection =ConnectionMultiplexer.Connect(
     "myserver.redis.cache.windows.net,ssl=false,password=password-here");

        return connection;
    }

        [Ignore]
        [Test]
        public void Exec()
        {
        var key = "testKey";
        using (var conn = CreateConnection())
        {
            var cache = conn.GetDatabase();

            // setup some data
            cache.KeyDelete(key);
            cache.HashSetAsync(key, "full", "some value", When.NotExists, CommandFlags.PreferMaster);
            cache.HashSetAsync(key, "last_accessesed", "some other data", When.NotExists, CommandFlags.PreferMaster);
            cache.KeyExpireAsync(key, DateTime.UtcNow.AddMilliseconds(2000), CommandFlags.FireAndForget);

            // test while exists
            var exists = cache.KeyExists(key);
            var ttl = cache.KeyTimeToLive(key);
            var fullWait = cache.HashGetAsync(key, "full", flags: CommandFlags.None);
            Assert.IsTrue(exists, "not expired key exists");
            Assert.IsNotNull(ttl, "ttl");
            Assert.AreEqual("some value", (string)fullWait.Result);

            // wait for expiry
            Thread.Sleep(TimeSpan.FromMilliseconds(5000));

            // test once expired
            exists = cache.KeyExists(key);
            ttl = cache.KeyTimeToLive(key);
            fullWait = cache.HashGetAsync(key, "full", flags: CommandFlags.None);
            Assert.IsFalse(exists, "expired key exists");
            Assert.IsNull(ttl, "ttl");
            Assert.IsNull((string)fullWait.Result);
        }
    }

ライン

Assert.IsFalse(exists, "expired key exists");

戻り値

  expired key exists
  Expected: False
  But was:  True

秒を使用するように変更しても解決しませんでした:

  cache.KeyExpireAsync(key, DateTime.UtcNow.AddSeconds(3), CommandFlags.FireAndForget);
  ...
  // wait for expiry
  Thread.Sleep(TimeSpan.FromSeconds(10));

同じ結果を返します ( Assert.IsFalse(exists, "期限切れのキーが存在します"))

  expired key exists
  Expected: False
  But was:  True
4

1 に答える 1