MemoryCache被意外覆盖
本文关键字:覆盖 意外 MemoryCache | 更新日期: 2023-09-27 18:28:09
我看到一个问题,我希望从一个昂贵的服务调用中获得一个集合,然后将其存储在缓存中,以便用于UI上的后续操作。我使用的代码如下:
List<OrganisationVO> organisations = (List<OrganisationVO>)MemoryCache.Default["OrganisationVOs"];
List<Organisation> orgs = new List<Organisation>();
if (organisations == null)
{
organisations = new List<OrganisationVO>();
orgs = pmService.GetOrganisationsByName("", 0, 4000, ref totalCount);
foreach (Organisation org in orgs)
{
OrganisationVO orgVO = new OrganisationVO();
orgVO = Mapper.ToViewObject(org);
organisations.Add(orgVO);
}
MemoryCache.Default.AddOrGetExisting("OrganisationVOs", organisations, DateTime.Now.AddMinutes(10));
}
List<OrganisationVO> data = new List<OrganisationVO>();
data = organisations;
if (!string.IsNullOrEmpty(filter) && filter != "*")
{
data.RemoveAll(filterOrg => !filterOrg.DisplayName.ToLower().StartsWith(filter.ToLower()));
}
我面临的问题是数据。RemoveAll操作会影响缓存的版本。即,我希望缓存的版本始终反映服务调用返回的完整数据集。然后,每当设置过滤器并应用它时,我都想从缓存中检索这个集合,但这不应该改变缓存的数据-即,后续过滤器应该在整个数据集上进行-最好的方法是什么?
如果要使用RemoveAll操作,则需要复制列表(ToList就足够了)。
此外,不要修改列表,而是考虑使用LINQ操作,如Where/Select。
我会:
- 动态应用筛选器,并在需要时替换筛选器(因此缓存完整的数据,但只返回cachedData.
Where(currentFilter)
- 制作两个缓存-一个用于完整数据,一个用于过滤后的数据-在这种情况下,第一个缓存应该只包含从服务返回的数据-也不需要缓存VO-数据