缓存管理的最佳实践

时间:2012-08-09 02:32:32

标签: c# caching

我想使用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;
}

如果我将用户的状态更改为已停用,我该如何刷新上述方法的缓存?

1 个答案:

答案 0 :(得分:0)

我之前建立了一个小的aop缓存fw,MbCache,我决定让失效成为“显式”操作而不是配置问题。让事情变得容易多了。

即使这个fw使用的是代码配置而不是属性(我不太喜欢这个属性,因为不同的原因 - 个人意见),我想这同样适用。你应该删除你的PurgeCacheAttribute,而不是让它成为一些运行时操作/方法?

这就是invalidation在MbCache中的表现,也许会给你一些想法?