也许我错过了一些一般性的东西,对此我很抱歉。但是在我的测试中,当我检查存在的过期键(散列)时,它返回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秒时,我的测试现在已经通过了。
在 changed Marc的示例中,也会发生这种情况(我将过期更改为400 ms):
[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));
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(存在,“过期密钥存在”))
expired key exists
Expected: False
But was: True
发布于 2014-07-18 12:14:27
我不能复制这个;您说KeyExists
返回true
,KeyTimeToLive
返回null
--听起来像是一个没有过期的键--但是它是存在的。
然后,您会说fullWait
返回null
--如果key
的哈希没有针对名称"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);
}
}
}
我很乐意调查,但到目前为止,它的表现似乎是正确的。
https://stackoverflow.com/questions/24807536
复制相似问题