一般的なことを見逃している可能性があります。申し訳ありません。しかし、私のテストでは、期限切れのキー (ハッシュ) の存在を確認すると、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
Expected: False
But was: True