2011-01-30 17 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鍵添加任何內容。第二次調用函數時,帖子將在緩存中,並且if塊中的代碼將不會運行,從而爲我們節省了訪問數據庫的空間。

+0

謝謝Clonked。如果可能的話,你能舉個例子說明如何使用你的班級嗎?我是C#的新手。謝謝。 – 2011-01-30 06:29:37