首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >key.Exists返回过期密钥的true

key.Exists返回过期密钥的true
EN

Stack Overflow用户
提问于 2014-07-17 15:19:12
回答 1查看 7.4K关注 0票数 4

也许我错过了一些一般性的东西,对此我很抱歉。但是在我的测试中,当我检查存在的过期键(散列)时,它返回true:

这里的“缓存”是IDatabase实例

代码语言:javascript
运行
复制
// 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设置也可以:

代码语言:javascript
运行
复制
cache.HashSetAsync(key, "full", value, When.NotExists, CommandFlags.PreferMaster);

更新:

@Marc_Gravell的答案帮助我在测试中发现了问题:当我设置过期时间太短(~500毫秒)时,我正在接收这种奇怪的行为。当我把它改为1秒或2秒时,我的测试现在已经通过了。

changed Marc的示例中,也会发生这种情况(我将过期更改为400 ms):

代码语言:javascript
运行
复制
[Test]
    public void Exec()
    {
        var key = "testKey";
        using (var conn = CreateConnection())
        {
            var cache = conn.GetDatabase();

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

// cache.HashSet(键,“满”,“某些值”);// cache.KeyExpire(key,TimeSpan.FromSeconds(3));

代码语言:javascript
运行
复制
            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);

带来

代码语言:javascript
运行
复制
  ttl
  Expected: not null
  But was:  null

更新2:

这段代码昨天对我很好,但现在不起作用了。

代码语言:javascript
运行
复制
   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);
        }
    }

线路

代码语言:javascript
运行
复制
Assert.IsFalse(exists, "expired key exists");

返回

代码语言:javascript
运行
复制
  expired key exists
  Expected: False
  But was:  True

更改为使用秒无助于:

代码语言:javascript
运行
复制
  cache.KeyExpireAsync(key, DateTime.UtcNow.AddSeconds(3), CommandFlags.FireAndForget);
  ...
  // wait for expiry
  Thread.Sleep(TimeSpan.FromSeconds(10));

返回相同的结果(Assert.IsFalse(存在,“过期密钥存在”))

代码语言:javascript
运行
复制
  expired key exists
  Expected: False
  But was:  True
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-18 12:14:27

我不能复制这个;您说KeyExists返回trueKeyTimeToLive返回null --听起来像是一个没有过期的键--但是它是存在的。

然后,您会说fullWait返回null --如果key的哈希没有针对名称"full"设置字段,就会发生这种情况。

人们期望HashSetAsync能够工作;有趣的问题是:它是在等待时返回true还是false

这通过了,例如:

代码语言:javascript
运行
复制
[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);
        }
    }
}

我很乐意调查,但到目前为止,它的表现似乎是正确的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24807536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档