web-dev-qa-db-ja.com

非常に単純なキャッシュの例を探しています

オブジェクトをキャッシュに追加し、それを再び取得して削除する方法の実際の簡単な例を探しています。

2番目の答え here は、私が見たい種類の例です...

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

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

しかし、これを試してみると、最初の行で次のようになります:

「キャッシュ」はタイプであり、指定されたコンテキストでは無効です。

そして、3行目で私は得る:

オブジェクトメソッドは、非静的フィールドには何とか何とかが必要です

だから、私はList<T>を持っているとしましょう...

var myList = GetListFromDB()

そして今、myListをキャッシュに追加し、それを取り出して削除したいだけです。

17
Casey Crookston

.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
    
18
Yuri Tceretian

これは私が過去にやった方法です:

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

[〜#〜] edit [〜#〜]:フォーマット。

ところで、あなたは何でもこれを行うことができます。これをシリアル化と組み合わせて使用​​して、オブジェクトの150Kアイテムリストを保存および取得しました。

11
Matthew Alltop

ここで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]);
8
Kelly

LazyCacheを作成して、これを可能な限り単純で簡単にし、同時に、2つのスレッドが同時にそれらをキャッシュしようとしても、キャッシュ可能な関数呼び出しを1回だけ実行するようにしました。

パッケージマネージャーコンソールで次のコマンドを実行します

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 で詳細をご覧ください

2
alastairtree

このサードパーティのキャッシュを試してください: 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

2
Rishabh Kumar