0

我想使用 AOP 将缓存功能应用于我网站中 BLL 层的所有方法。就像下面这样:

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

属性的第一个参数Cacheable确定方法的哪个参数将用于创建缓存键。第二个参数GroupName计算出缓存键的前缀。如上例,将生成一个key-“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我应该一一生成密钥并清除所有密钥吗?考虑到高性能缓存是否过于复杂,即使它只是一个非常简单的案例。假设我有一个列表查询方法:

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

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

4

1 回答 1

0

前段时间我构建了一个小型 aop 缓存固件 MbCache,在那里我决定让失效成为“显式”操作而不是配置问题。让事情变得容易多了。

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

这就是在 MbCache 中进行失效的方式,也许这会给你一些想法?

于 2012-08-15T07:43:06.730 回答