寻找一个非常简单的缓存示例

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&lt;T&gt;...

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 中查看更多信息

【讨论】:

以上是关于寻找一个非常简单的缓存示例的主要内容,如果未能解决你的问题,请参考以下文章

核心数据和图像缓存

多对多关系示例

寻找一个简单的 Spring 安全示例 [关闭]

简单的死锁示例

寻找一个简单的 ssl erlang 示例

寻找简单的 MVVM Light 示例