2012-08-09 132 views
0

我想使用AOP將緩存功能應用於我網站中BLL圖層的所有方法。 就像下面:緩存管理的最佳實踐

[Cacheable(new string[] { "id" }, GroupName = "UserInfoByID", LiveTime = "00:05:00")] 
public UserInfo GetUserInfoByID(int id) 
{ 
    return UserDAO.GetUserInfo(id); 
} 

Cacheable屬性的第一個參數計算出該方法的精氨酸將被用於創建緩存鍵。第二個參數GroupName計算出緩存鍵的前綴。如上例所示,將生成一個鍵 - 「UserInfoByID(123)」(假設查詢ID爲123)。我創建另一個屬性:

[PurgeCache(new string[] { "userInfo.ID" }, GroupName = "UserInfoByID")] 
public void UpdateUserInfo(UserInfo userInfo) 
{ 
    UserDAO.UpdateUserInfo(userInfo); 
} 

它將使用userInfo.ID和相同GroupName- UserInfoByID產生一個相同的密鑰來清除緩存:UserInfoByID(123)。它是每一個簡單的使用和優雅?但是,有一個非常棘手的問題。我有另一種方法:

public void ManageUser(int[] userID, int status) 
{ 
    UserDAO.ManageUser(userID, status); 
} 

該方法用於更改用戶的狀態。如何在執行後刷新緩存?我應該用int[] userID一個一個地生成密鑰並清除所有密鑰?考慮到高性能緩存,它是否太複雜,儘管它只是一個非常簡單的例子。假設我有一個列表查詢mehod:

[Cacheable(new string[] { "regionID" }, GroupName = "UserList", LiveTime = "00:05:00")] 
public List<UserInfo> GetUserList(int regionID) 
{ 
    List<UserInfo> result = UserDAO.GetUserList(regionID); 
    return result; 
} 

如果我更改用戶的狀態爲disactiviated,如何刷新上述方法的緩存?

回答

0

我之前建立了一個小型aop緩存fw,MbCache,我決定讓失效成爲一個「顯式」操作而不是配置問題。使事情變得更容易。儘管這個fw使用了代碼配置而不是屬性(我不太喜歡屬性thingy出於不同的原因 - 個人意見),但我猜這同樣適用。你應該刪除你的PurgeCacheAttribute,而讓它成爲一些運行時操作/方法?

這是如何invalidation是在MbCache,可能會給你一些想法?