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"))

  expired key exists
  Expected: False
  But was:  True
4

1 回答 1

2

我无法重现这个;你说KeyExists返回trueKeyTimeToLive返回null- 这听起来像一个没有到期的密钥 - 但它存在。

然后你说fullWait返回null- 如果哈希 atkey没有针对 name 设置字段,则可能发生这种情况"full"

预计HashSetAsync奏效;有趣的问题是:它会返回true还是false等待?

这通过了,例如:

[TestFixture]
public class SO24807536 : TestBase
{
    public void Exec()
    {
        var key = Me();
        using(var conn = Create())
        {
            var cache = conn.GetDatabase();

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

            // 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);

            // wait for expiry
            Thread.Sleep(TimeSpan.FromSeconds(4));

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

我很乐意进行调查,但到目前为止,它看起来运行正常。

于 2014-07-18T12:14:27.403 回答