寻找一个非常简单的Cache示例

时间:2017-01-16 20:07:01

标签: c# asp.net-mvc caching

我正在寻找一个简单的示例,说明如何将对象添加到缓存中,再次将其取回并删除它。

第二个答案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<T> ...

var myList = GetListFromDB()

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

5 个答案:

答案 0 :(得分:16)

.NET提供了一些缓存类

  • 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 - 此类可以在用户代码中构建。它具有不同的界面和更多功能,如update \ remove回调,区域,监视器等。要使用它,您需要导入库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
    

答案 1 :(得分:7)

以下是我过去做过的方式:

     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)
        };

       _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>;
    }

编辑:格式化。

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

答案 2 :(得分:7)

如果你在这里使用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]);

答案 3 :(得分:3)

我编写了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

中查看更多信息

答案 4 :(得分:2)

尝试使用此第三方缓存: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