我使用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相关的缓存?
答案 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