redis - 第一次将过期设置为已经过去的时间返回 True

标签 redis stackexchange.redis

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

从我观察到的(一致的)行为来看,第一次它总是“成功”(返回真),而第二次它的行为符合预期(返回假)。

    [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(...);
    }

可能是我做错了什么?

最佳答案

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

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

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

对于一致的运行,您可能还想在每次运行前删除 key :

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

在顶部。

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

关于redis - 第一次将过期设置为已经过去的时间返回 True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25113323/

相关文章:

java - 过期的 Redisson key 在 Redis Cli 中仍然可见

c# - 如何/在哪里可以找到我是否忘记处置 Redis 连接?

C# Azure Redis 缓存 - 无法访问已处置的对象异常

asp.net - Redis - ERR 未知命令 'EVAL'

redis - 如何在 .Net 应用程序中查看所有存储 session 的 REDIS 键和值?

c# - RedisSessionStateProvider 与 ProtoBuf 序列化导致错误

redis - StackExchange.Redis.StrongName.dll!StackExchange.Redis.SocketManager.WriteAllQueues()

node.js - Nodejs 连接到 AWS ElasticCache 复制组

session - 使用 Redis 存储 session 有多安全?

Redis key 空间通知过期未触发