【问题标题】:Looking for a very simple Cache example寻找一个非常简单的缓存示例
【发布时间】:2017-05-31 18:04:54
【问题描述】:

我正在寻找一个真正简单的示例,说明如何将对象添加到缓存、将其重新取出并删除。

第二个答案here 是我希望看到的那种例子......

List<object> list = new List<Object>();

Cache["ObjectList"] = list;                 // add
list = ( List<object>) Cache["ObjectList"]; // retrieve
Cache.Remove("ObjectList");                 // remove

但是当我尝试这个时,在第一行我得到:

'Cache' 是一种类型,在给定的上下文中是无效的。

在第三行我得到:

非静态字段blah blah blah需要对象方法

所以,假设我有一个List&lt;T&gt;...

var myList = GetListFromDB()

现在我只想将myList 添加到缓存中,将其取出并删除。

【问题讨论】:

    标签: c# asp.net-mvc caching


    【解决方案1】:

    .NET 提供了一些 Cache 类

    • System.Web.Caching.Cache - ASP.NET 中的默认缓存机制。您可以通过属性Controller.HttpContext.Cache 获取此类的实例,也可以通过单例HttpContext.Current.Cache 获取它。不应显式创建此类,因为在后台它使用另一个内部分配的缓存引擎。 要使您的代码正常工作,最简单的方法是执行以下操作:

      public class AccountController : System.Web.Mvc.Controller{ 
        public System.Web.Mvc.ActionResult Index(){
          List<object> list = new List<Object>();
      
          HttpContext.Cache["ObjectList"] = list;                 // add
          list = (List<object>)HttpContext.Cache["ObjectList"]; // retrieve
          HttpContext.Cache.Remove("ObjectList");                 // remove
          return new System.Web.Mvc.EmptyResult();
        }
      }
      
    • System.Runtime.Caching.MemoryCache - 这个类可以在用户代码中构建。它具有不同的界面和更多功能,例如更新\删除回调、区域、监视器等。要使用它,您需要导入库System.Runtime.Caching。它也可以在 ASP.net 应用程序中使用,但您必须自己管理它的生命周期。

      var cache = new System.Runtime.Caching.MemoryCache("MyTestCache");
      cache["ObjectList"] = list;                 // add
      list = (List<object>)cache["ObjectList"]; // retrieve
      cache.Remove("ObjectList");                 // remove
      

    【讨论】:

    【解决方案2】:

    这是我过去的做法:

         private static string _key = "foo";
         private static readonly MemoryCache _cache = MemoryCache.Default;
    
         //Store Stuff in the cache  
       public static void StoreItemsInCache()
       {
          List<string> itemsToAdd = new List<string>();
    
          //Do what you need to do here. Database Interaction, Serialization,etc.
           var cacheItemPolicy = new CacheItemPolicy()
           {
             //Set your Cache expiration.
             AbsoluteExpiration = DateTime.Now.AddDays(1)
            };
             //remember to use the above created object as third parameter.
           _cache.Add(_key, itemsToAdd, cacheItemPolicy);
        }
    
        //Get stuff from the cache
        public static List<string> GetItemsFromCache()
        {
          if (!_cache.Contains(_key))
                   StoreItemsInCache();
    
            return _cache.Get(_key) as List<string>;
        }
    
        //Remove stuff from the cache. If no key supplied, all data will be erased.
        public static void RemoveItemsFromCache(_key)
        {
          if (string.IsNullOrEmpty(_key))
            {
                _cache.Dispose();
            }
            else
            {
                _cache.Remove(_key);
            }
        }
    

    编辑:格式化。

    顺便说一句,你可以用任何东西做到这一点。我将它与序列化结合使用来存储和检索 150K 项目的对象列表。

    【讨论】:

    • 很好的例子,只是一个小改动——这一行应该是小写驼峰式:_cache.Add(_key, itemsToAdd, cacheItemPolicy);
    【解决方案3】:

    如果你在这里使用 MemoryCache 是一个非常简单的例子:

    var cache = MemoryCache.Default;
    
    var key = "myKey";
    var value = "my value";
    var policy = new CacheItemPolicy { SlidingExpiration = new TimeSpan(2, 0, 0) };
    cache.Add(key, value, policy);
    
    Console.Write(cache[key]);
    

    【讨论】:

      【解决方案4】:

      试试这个第三方缓存:CacheCrow,它是一个简单的基于 LFU 的缓存。

      在 Visual Studio 中使用 powershell 命令安装:Install-Package CacheCrow

      代码片段:

       // initialization of singleton class
          ICacheCrow<string, string> cache = CacheCrow<string, string>.Initialize(1000);
      
          // adding value to cache
          cache.Add("#12","Jack");
      
          // searching value in cache
          var flag = cache.LookUp("#12");
          if(flag)
          {
              Console.WriteLine("Found");
          }
      
          // removing value
          var value = cache.Remove("#12");
      

      更多信息您可以访问:https://github.com/RishabKumar/CacheCrow

      【讨论】:

        【解决方案5】:

        我编写 LazyCache 是为了使这尽可能简单和轻松,同时确保您只执行一次可缓存函数调用,即使两个线程同时尝试缓存它们。

        在包管理器控制台中运行以下命令

        PM> Install-Package LazyCache
        

        在类的顶部添加命名空间

        using LazyCache;
        

        现在缓存东西:

        // Create the cache - (in constructor or using dependency injection)
        IAppCache cache = new CachingService();
        
        // Get products from the cache, or if they are not
        // cached then get from db and cache them, in one line
        var products = cache.GetOrAdd("get-products", () => dbContext.Products.ToList());
        
        // later if you want to remove them
        cache.Remove("get-products");
        

        cache aside patternthe LazyCache docs 中查看更多信息

        【讨论】:

          猜你喜欢
          • 2022-01-15
          • 2011-10-12
          • 1970-01-01
          • 2011-06-21
          • 2011-04-20
          • 2010-11-11
          • 2010-10-09
          • 1970-01-01
          相关资源
          最近更新 更多