Search code examples
c#.netcaching

.NET Caching how does Sliding Expiration work?


If I use an ObjectCache and add an item like so:

ObjectCache cache = MemoryCache.Default;
string o = "mydata";
cache.Add("mykey", o, DateTime.Now.AddDays(1));

I understand the object will expire in 1 day. But if the object is accessed 1/2 a day later using:

object mystuff = cache["mykey"];

Does this reset the timer so it's now 1 day since the last access of the entry with the key "mykey", or it still 1/2 a day until expiry?

If the answer is no is there is a way to do this I would love to know.


Solution

  • There are two types of cache policies you can use:

    CacheItemPolicy.AbsoluteExpiration will expire the entry after a set amount of time.

    CacheItemPolicy.SlidingExpiration will expire the entry if it hasn't been accessed in a set amount of time.

    The ObjectCache Add() overload you're using treats it as an absolute expiration, which means it'll expire after 1 day, regardless of how many times you access it. You'll need to use one of the other overloads. Here's how you'd set a sliding expiration (it's a bit more complicated):

    CacheItem item = cache.GetCacheItem("item");
    
    if (item == null) {
    
        CacheItemPolicy policy = new CacheItemPolicy {
            SlidingExpiration = TimeSpan.FromDays(1)
        }
    
        item = new CacheItem("item", someData);
    
        cache.Set(item, policy);
    }
    

    You change the TimeSpan to the appropriate cache time that you want.