Ehcache Java Spring MVC和分页@Cacheable

时间:2015-04-03 06:17:39

标签: java spring caching pagination ehcache

我使用Ehcache 2.9.0在我的Spring应用程序中,我希望能够根据分页缓存结果。

首先是我现在如何使用Ehcache:

@Cacheable(value ="EmployeesByCompanyId", key="#companyId")    
public List<Employee> getEmployeesByCompanyId(String companyId) throws Exception {
        return employeeRepository.getEmployeesByCompanyId(companyId);
}

@CacheEvict(value ="EmployeesByCompanyId", key="#company.id")
public Employee createNewEmployee(Employee employee, Company company)
{ ... }

现在,我希望将它用于同一目的,但需要分页。示例(不正确,但这是主意):

@Cacheable(value ="EmployeesByCompanyId", key="#companyId#page#maxResult"})    
@Override
public List<Employee> getEmployeesByCompanyId(String companyId, int page, int maxResult) throws Exception {
            return employeeRepository.getEmployeesByCompanyId(companyId, page, maxResult);
        }

然后,当我有一个新员工到列表时,它应该Evict缓存但我想驱逐与companyId相关的缓存。如果我写这样的东西,它会删除与companyId相关的缓存:

@CacheEvict(value ="EmployeesByCompanyId", key="#companyId")

在向该公司添加新员工时,如何使缓存与分页一起工作并逐出与companyId相关的缓存?

1 个答案:

答案 0 :(得分:2)

这是一个基于我们评论的可能解决方案。

从缓存管理器获取本机EhCache对象(因为Spring的Cache接口不支持getKeys方法)

@Autowired private CacheManager cacheManager;
...
EhCache cache = (EhCache) cacheManager.getCache("EmployeesByCompanyId").getNativeCache();

然后你可以迭代缓存键,获取以companyId开头的缓存键并从缓存中删除它们

for (Object key: cache.getKeys()) {
  if((String)key.startsWith(companyId))
    cache.remove(key);
}

请参阅http://ehcache.org/apidocs/2.8.4/net/sf/ehcache/Ehcache.html