オブジェクトをキャッシュに追加し、それを再び取得して削除する方法の実際の簡単な例を探しています。
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
をキャッシュに追加し、それを取り出して削除したいだけです。
.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
これは私が過去にやった方法です:
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アイテムリストを保存および取得しました。
ここで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]);
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 で詳細をご覧ください
このサードパーティのキャッシュを試してください: 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