【问题标题】:First time setting expiration to already passed time returns True第一次将过期设置为已经过去的时间返回 True
【发布时间】:2014-08-04 16:15:11
【问题描述】:

在下面的测试中,我试图将密钥的到期时间设置为已经过去的时间(10 秒前)。如果设置过期“失败”,我需要它能够抛出异常。我了解,我可以在设置缓存之前验证过期时间,但在某些情况下,我可能更愿意避免单独检查。

从我可以观察到的(一致的)行为,第一次它总是“成功”(返回 true),第二次它的行为符合预期(返回 false)。

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

            cache.HashSet(key, "full", "test", When.NotExists, CommandFlags.PreferMaster);

            Thread.Sleep(10 * 1000);

            // When
            var expiresOn = DateTime.UtcNow.AddSeconds(-10);

            var firstResult = cache.KeyExpire(key, expiresOn, CommandFlags.PreferMaster);
            var secondResult = cache.KeyExpire(key, expiresOn, CommandFlags.PreferMaster);
            var exists = cache.KeyExists(key);
            var ttl = cache.KeyTimeToLive(key);

            // Then
            secondResult.ShouldBe(false);
            firstResult.ShouldBe(false);
            exists.ShouldBe(false);
            ttl.ShouldBe(null);
        }
    }


    private ConnectionMultiplexer CreateConnection()
    {
        return ConnectionMultiplexer connection =ConnectionMultiplexer.Connect(...);
    }

可能是我做错了什么?

【问题讨论】:

    标签: redis stackexchange.redis


    【解决方案1】:

    KeyExpire 返回一个布尔值,指示是否可以设置到期时间。当您将到期时间设置为过去时,密钥不再存在,因此当您尝试第二次设置它时:它失败了。

    因此,预期的行为应该是:

    firstResult.ShouldBe(true);
    secondResult.ShouldBe(false);
    exists.ShouldBe(false);
    ttl.ShouldBe(null);
    

    为了保持一致的运行,您可能还希望在每次运行之前删除密钥:

    var cache = conn.GetDatabase();
    cache.KeyDelete(key);
    cache.HashSet(key, "full", "test", When.NotExists);
    

    在顶部。

    这样:它似乎按我的预期工作。如果您看到不同的结果,请确切地说出哪个结果是出乎意料的。

    【讨论】:

    • 根据您描述的行为,它似乎按预期工作。我只是预计在已经过期的时间上设置过期不会成功。我需要在代码中添加此检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多