スプリング ブート アプリケーションのキャッシュについて質問があります。1 つのエンティティを管理する単純な Web アプリケーションがあり、Spring Data JPA、JCache を Hazelcast 実装で使用します。2 つのキャッシュを作成しました。
- IDでエンティティをキャッシュする
- エンティティ フィールド値とキャッシュ値としてのエンティティのリストによる別の 1 つ
システムから単一の値を削除すると、最初のキャッシュからこの値を削除し、それぞれのキー (フィールド値) を持つレコードがあれば、2 番目のキャッシュからエンティティのリスト全体を削除します。私の質問: 2 番目のキャッシュからレコード全体を削除せずに更新し、キャッシュ値リストから 1 つのエンティティを削除するだけの解決策はありますか?
例:
import com.google.gwt.thirdparty.guava.common.collect.Lists;
import com.test.mmm.jcache.entity.Person;
import com.test.mmm.jcache.repository.PersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.*;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class PersonService {
private final PersonRepository personRepository;
@Caching(put = @CachePut(value = "persons", key = "#person.id"),
evict = @CacheEvict(value = "personsByLastName", key = "#person.lastName"))
public Person save(Person person) {
return personRepository.save(person);
}
@Caching(evict = {
@CacheEvict(value = "persons", key = "#person.id"),
@CacheEvict(value = "personsByLastName", key = "#person.lastName")
})
public void delete(Person person) {
personRepository.delete(person.getId());
}
@Cacheable(value = "persons", key = "#id")
public Person findOne(Long id) {
return personRepository.findOne(id);
}
@Cacheable(value = "personsByLastName", key = "#lastName")
public List<Person> findByLastName(String lastName) {
return personRepository.findByLastName(lastName);
}
public List<Person> findAll() {
return Lists.newArrayList(personRepository.findAll());
}
@Autowired
public PersonService(PersonRepository personRepository) {
this.personRepository = personRepository;
}
}