我正在寻找一个简单的示例,说明如何将对象添加到缓存中,再次将其取回并删除它。
第二个答案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
添加到缓存中,将其取出并删除。
答案 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");
中查看更多信息
答案 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