Ehcache Java Spring MVC 和分页 @Cacheable

Ehcache Java Spring MVC and pagination @Cacheable

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

首先是我现在使用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);
        }

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

相关的缓存吗
@CacheEvict(value ="EmployeesByCompanyId", key="#companyId")

这家公司新增员工时,如何让缓存配合分页并清除companyId相关的缓存?

这里是根据我们的意见提出的可能的解决方案。

从缓存管理器

获取本机 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