(.NET 4.5) MemoryCache を SlidingExpiration と組み合わせて使用しています。
メソッド .AddOrGetExisting() は有効期限を考慮していないようですが、.Get() は考慮していることに気付きました。
単体テスト:
[TestMethod]
public void NonWorking()
{
var memCache = new MemoryCache("somekey");
var cachePolicy = new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromSeconds(1) };
var cacheEntry = memCache.AddOrGetExisting("key1", "foo", cachePolicy);
Assert.AreEqual(null, cacheEntry); // OK: AddOrGetExisting returns null, because it wasn't existing yet
Thread.Sleep(1100);
// Expecting null, since the existing item for key1 has expired by now.
// It is, however, still "foo".
Assert.AreEqual(null, memCache.AddOrGetExisting("key1", "bar", cachePolicy));
// FYI: afterwards, memCache.Get("key1") still equals "foo"
}
[TestMethod]
public void Working()
{
var memCache = new MemoryCache("somekey");
var cachePolicy = new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromSeconds(1) };
var cacheEntry = memCache.AddOrGetExisting("key1", "foo", cachePolicy);
Assert.AreEqual(null, cacheEntry); // OK: AddOrGetExisting returns null, because it wasn't existing yet
Thread.Sleep(1100);
Assert.AreEqual(null, memCache.Get("key1"));
}
質問:
これは.AddOrGetExisting()の予想される動作ですか?
.Get() にフォールバックし、null の場合は .Add() にフォールバックできます。
ただし、その結果、スレッドセーフを確保するために独自のロックを実装する必要があります。