可能是我错过了一些一般性的东西,对此我感到抱歉。但在我的测试中,当我检查过期密钥(哈希)是否存在时,它返回 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