我正在使用Spring Cache,我在其中传递了一组键,返回是一个实体列表.我想让缓存框架理解返回列表中的每个元素都要使用相应的代码进行缓存.目前,似乎关键是整个列表,如果我在后续调用中缺少一个键,它将尝试再次重新加载整个集合.
@Override
@Cacheable(value = "countries")
public List<Country> getAll(List<String>codes) {
return countryDao.findAllInCodes(codes);
}
Run Code Online (Sandbox Code Playgroud)
另一种可能性是返回是一个映射,同样我希望缓存足够智能,只能查询以前从未查询过的项目,也可以用它的密钥缓存每个项目.
@Override
@Cacheable(value = "countries")
public Map<String,Country> getAllByCode(List<String>codes) {
return countryDao.findAllInCodes(codes);
}
Run Code Online (Sandbox Code Playgroud)
假设国家类看起来像这样:
class Country{
String code;
String fullName;
long id;
... // getters setters constructurs etc..
}
Run Code Online (Sandbox Code Playgroud)
这可以用Spring Cache吗?
我试图将缓存添加到CRUD应用程序,我开始执行以下操作:
@Cacheable("users")
List<User> list() {
return userRepository.findAll()
}
@CachePut(value = "users", key = "#user.id")
void create(User user) {
userRepository.create(user)
}
@CachePut(value = "users", key = "#user.id")
void update(User user) {
userRepository.update(user)
}
@CacheEvict(value = "users", key = "#user.id")
void delete(User user) {
userRepository.delete(user)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我希望create / update / delete操作可以为该操作更新已存储在缓存中的元素list()(请注意,list()不是从数据库中拉出而是从数据引擎中拉出),但是我无法做到这一点。
我想缓存list()单独返回的所有元素,以便所有其他操作可以使用来更新缓存#user.id。或者,可能需要执行所有操作来更新已存储在缓存中的列表。
我读到我可以在更新整个缓存时逐出整个缓存,但是我想避免这样的事情:
@CacheEvict(value = "users", allEntries=true)
void create(User user) {
userRepository.create(user)
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在缓存的集合中创建/更新/删除值?还是将集合中的所有值作为单独的键缓存?
我想使用Spring的Cache抽象将方法注释为@Cacheable。但是,某些方法被设计为采用参数的数组或集合并返回一个集合。例如,考虑使用以下方法查找实体:
public Collection<Entity> getEntities(Collection<Long> ids)
Run Code Online (Sandbox Code Playgroud)
从语义上讲,我需要Entity单独缓存对象(由id键),而不是基于整个ID的集合。类似于这个问题在问什么。
简单的Spring Memcached通过其支持了我想要的ReadThroughMultiCache,但是我想使用Spring的抽象来支持轻松更改缓存存储实现(Guava,Coherence,Hazelcast等),而不仅仅是memcached。
有哪些策略可以使用Spring Cache缓存这种方法?