2011-01-30 11 views
0

データベースからメモリに文字列をキャッシュしたいので、毎回データベースにアクセスする必要はありません。私はSystem.Runtime.Cachingを使ってみましたが、うまくいかないようです。MVC 2 - メモリ内の文字列のキャッシング

ローカルサイトでは、すべてのデータがキャッシュされますが、ユーザーはセカンダリサイトで認証される必要があります。ユーザーが認証されると、それらはローカルサイトに戻されますが、キャッシュされたすべてのデータはなくなります。

上記の問題を解決する方法はありますか?以下は私のコードの一部です:

using System.Runtime.Caching; 

ObjectCache cache = MemoryCache.Default; 

public bool CacheIsSet(string key) 
{ 
    return cache.Contains(key); 
} 

public object CacheGet(string key) 
{ 
    return cache.Get(key); 
} 

public void CacheSet(string key, object value) 
{ 
    CacheItemPolicy policy = new CacheItemPolicy(); 
    cache.Set(key, value, policy); 
} 

ありがとう。

答えて

6

HttpRuntime.Cacheオブジェクトを参照する必要があります。私はあなたの質問で参照したものと同様に、この周りにラッパーを作成しました。お気軽にご利用ください:

using System.Web.Caching; 

public class CachingService 
{ 
    protected Cache Cache 
    { 
     get; 
     set; 
    } 

    public int CacheDurationMinutes 
    { 
     get; 
     set; 
    } 

    public CachingService() 
    { 
     Cache = HttpRuntime.Cache; 
     CacheDurationMinutes = 60; 
    } 

    public virtual object Get(string keyname) 
    { 
     return Cache[keyname]; 
    } 

    public virtual T Get<T>(string keyname) 
    { 
     T item = (T)Cache[keyname]; 

     return item; 
    } 

    public virtual void Insert(string keyname, object item) 
    { 
     Cache.Insert(keyname, item, null, DateTime.UtcNow.AddMinutes(CacheDurationMinutes), Cache.NoSlidingExpiration); 
    } 

    public virtual void Insert(string keyname, object item, CacheDependency dependency) 
    { 
     Cache.Insert(keyname, item, dependency); 
    } 

    public virtual void Remove(string keyname) 
    { 
     Cache.Remove(keyname); 
    } 
} 

ここでは、サンプルの使用例を示します。機能LoadPostsは、ブログ投稿を読み込んでサイトに表示することになっています。ポストがキャッシュされている場合、それはデータベースからの投稿をロードし、それらをキャッシュしますない場合、この関数は最初、表示されます。

public IEnumerable<BlogPost> LoadPosts() 
{ 
    var cacheService = new CachingService(); 
    var blogPosts = cacheService.Get<IEnumerable<BlogPost>>("BlogPosts"); 

    if (blogPosts == null) 
    { 
    blogPosts = postManager.LoadPostsFromDatabase(); 
    cacheService.Insert("BlogPosts", blogPosts); 
    } 

    return blogPosts; 
} 

この機能が実行されて初めて、キャッシュは我々ので、nullを返します。まだBlogPostsキーに何も追加していませんでした。関数が呼び出された2回目には、ポストはキャッシュに格納され、ブロックifのコードは実行されず、データベースへの移動は保存されません。

+0

ありがとうございました。可能であれば、クラスの使い方の例を教えてください。私はC#の初心者です。ありがとう。 –

+0

私は 'CachingService'クラスの使用例を示すサンプル関数を含むように答えを更新しました。 –

+0

ありがとうございます。それを今試みている。 –

関連する問題