gpt4 book ai didi

spring - 如何更新/删除项目集合中已缓存的项目

转载 作者:行者123 更新时间:2023-12-01 23:41:14 25 4
gpt4 key购买 nike

我正在使用 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" 缓存的产品不再相同,例如数据库。

我的意思是,检查以下两个方法,它们能够更新/删除一个项目,并且相同的项目缓存在另一个key="#root.target中。产品”

@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);
}

我不想再次调用要缓存到 key="#root.target.PRODUCTS" 的 500 或 499 个产品

可以这样做吗?怎么办?

提前致谢。

最佳答案

使用缓存抽象来缓存集合是底层缓存系统正在执行的操作的重复。因为这是重复的,所以事实证明您必须以一种或另一种方式在自己的代码中诉诸某种重复(集合的重复键是其明显的表示)。因为存在重复,所以你必须以某种方式同步状态

如果您确实需要访问整个集合和单个元素,那么您可能应该使用最简单的快捷方式。首先,您应该确保您的缓存包含所有不明显的元素。实际上远非如此。考虑到你有:

//EhCacheCache cache = (EhCacheCache) cacheManager.getCache("products");


@Override
public Set<Product> findAll() {
Ehcache nativeCache = cache.getNativeCache();
Map<Object, Element> elements = nativeCache.getAll(nativeCache.getKeys());
Set<Product> result = new HashSet<Product>();
for (Element element : elements.values()) {
result.add((Product) element.getObjectValue());
}
return Collections.unmodifiableSet(result);
}

elements 结果实际上是一个延迟加载的映射,因此调用 values() 可能会引发异常。您可能想要循环按键或其他东西。

您必须记住,缓存抽象简化了对底层缓存基础设施的访问,但绝不取代它:如果您必须直接使用 API,这可能是您必须做的某种事情。

现在,我们可以将转换保持在 SPR-12036如果您相信我们可以改进该领域的缓存抽象。谢谢!

关于spring - 如何更新/删除项目集合中已缓存的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24940976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com