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
我在我的 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