13

私はSpringとEhCacheを使用しています

私は次の方法を持っています

@Override
@Cacheable(value="products", key="#root.target.PRODUCTS")
public Set<Product> findAll() {
    return new LinkedHashSet<>(this.productRepository.findAll());
}

@Cacheable と @CachePut と @CacheEvict で動作する他のメソッドがあります。

ここで、データベースが 100 個の製品を返し、それらが を介してキャッシュされているとします。key="#root.target.PRODUCTS"その後、他の方法で項目をデータベースに挿入、更新、削除します。したがって、 を通じてキャッシュされた製品key="#root.target.PRODUCTS"は、データベースなどとは異なります。

つまり、次の2つの方法を確認してください。それらはアイテムを更新/削除でき、同じアイテムが他のアイテムにキャッシュされますkey="#root.target.PRODUCTS"

@Override
@CachePut(value="products", key="#product.id")
public Product update(Product product) {
    return this.productRepository.save(product);
}

@Override
@CacheEvict(value="products", key="#id")
public void delete(Integer id) {
    this.productRepository.delete(id);
}

を介してキャッシュ内のアイテムを更新/削除できるかどうかを知りたいのですがkey="#root.target.PRODUCTS"、製品が更新された場合は 100、製品が削除された場合は 499 になります。

私のポイントは、次のことを避けたいということです。

@Override
@CachePut(value="products", key="#product.id")
@CacheEvict(value="products", key="#root.target.PRODUCTS")
public Product update(Product product) {
    return this.productRepository.save(product);
}

@Override
@Caching(evict={
        @CacheEvict(value="products", key="#id"),
        @CacheEvict(value="products", key="#root.target.PRODUCTS")
})
public void delete(Integer id) {
    this.productRepository.delete(id);
}

500 または 499 の製品を再度呼び出してキャッシュに入れたくありません。key="#root.target.PRODUCTS"

これを行うことは可能ですか?どのように?

前もって感謝します。

4

5 に答える 5