寻找一个非常简单的缓存示例
Posted
技术标签:
【中文标题】寻找一个非常简单的缓存示例【英文标题】: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<T>
...
var myList = GetListFromDB()
现在我只想将myList
添加到缓存中,将其取出并删除。
【问题讨论】:
【参考方案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
【讨论】:
嗯,MS 说:docs.microsoft.com/en-us/dotnet/framework/performance/…,建议至少对于新应用程序使用 MemoryCache 命名空间。 现在他们建议使用Microsoft.Extensions.Caching.Memory 而不是 System.Runtime.Caching.MemoryCache【参考方案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 pattern 或the LazyCache docs 中查看更多信息
【讨论】:
以上是关于寻找一个非常简单的缓存示例的主要内容,如果未能解决你的问题,请参考以下文章