Automatically re-populate the cache at expiry time

前端 未结 4 1162
悲哀的现实
悲哀的现实 2021-02-09 14:52

I currently cache the result of a method invocation.

The caching code follows the standard pattern: it uses the item in the cache if it exists, otherwise it calculates t

相关标签:
4条回答
  • 2021-02-09 15:07

    Here's a cache that never expires anything:

    var cache = new ConcurrentDictionary<TKey, TValue>();
    
    var value = cache.GetOrAdd(someKey, key => MyMethod(key));
    

    Does that help?


    Here's a cache that never expires anything and refreshes the value after a certain lifetime:

    var cache = new ConcurrentDictionary<TKey, Tuple<TValue, DateTime>>();
    
    var value = cache.AddOrUpdate(someKey,
                 key => Tuple.Create(MyMethod(key), DateTime.Now),
        (key, value) => (value.Item2 + lifetime < DateTime.Now)
                      ? Tuple.Create(MyMethod(key), DateTime.Now)
                      : value)
                      .Item1;
    

    Does that help?

    0 讨论(0)
  • 2021-02-09 15:22

    A new addition to the .NET Framework 4.0 is the MemoryCache Class

    Quote from the Docs:

    The MemoryCache class is similar to the ASP.NET Cache class. The MemoryCache class has many properties and methods for accessing the cache that will be familiar to you if you have used the ASP.NET Cache class

    You could use the AddOrGetExisting Method to get or create a CacheItem if does not exist.

    0 讨论(0)
  • 2021-02-09 15:24

    Since this is ASP.NET, the Cache.Insert() method allows you to specify a callback delegate.

    Does this sound like a sensible approach?

    Yes, the callback (and File-dependency) are supplied for exactly this kind of situation. You still have ro make a trade of between resources, latency and out-of-dateness.

    0 讨论(0)
  • 2021-02-09 15:30

    There doesn't seem to be any point in expiring an object just to immediately recreate it. Just turn off expiration; dtb shows how.

    0 讨论(0)
提交回复
热议问题