【问题标题】:Evict not working in Spring boot驱逐在Spring Boot中不起作用
【发布时间】:2017-10-14 17:18:14
【问题描述】:

我有一个获取所有数据的方法,我正在缓存该方法的结果,但我无法驱逐结果。

@Component("cacheKeyGenerator")
public class CacheKeyGenerator implements KeyGenerator {

    @Override
    public Object generate(Object target, Method method, Object... params) {
        final List<Object> key = new ArrayList<>();
        key.add(method.getDeclaringClass().getName());
        return key;
    }
}

缓存方法:-

 @Override
        @Cacheable(value="appCache",keyGenerator="cacheKeyGenerator")
        public List<Contact> showAllContacts() {
            return contactRepository.findAll();
        }

    @Override
        @CachePut(value="appCache",key="#result.id")
        public Contact addData(Contact contact) {
            return contactRepository.save(contact);
        }

现在,当调用 addData 时,我希望将缓存“appCache”中键为“cacheKeyGenerator”的数据逐出。这样,“showAllContacts()”方法返回的数据是准确的。谁能帮忙!

完整的代码可以在-https://github.com/iftekharkhan09/SpringCaching找到

【问题讨论】:

  • 使用另一种方法@CacheEvict 删除缓存条目?这就是你要找的吗?
  • 查看您当前的实现会引发一个问题:您是否希望在调用 add(...) 时驱逐缓存,因为您显式调用了空(但带注释的)方法 evictCache()

标签: spring spring-boot ehcache spring-cache


【解决方案1】:

假设您有一个已知的showAllContacts 的常量缓存键,那么解决方案应该是在addData 上简单地添加@CacheEvict,并传入缓存名称和键值:

@Override
@Caching(
    put = {@CachePut(value="appCache", key="#result.id")},
    evict = {@CacheEvict(cacheNames="appCache", key="someConstant")}
)
public Contact addData(Contact contact) {
    return contactRepository.save(contact);
}

但是,因为您使用的是密钥生成器,所以涉及的内容更多一些。现在,鉴于您的密钥生成器的作用,您可以改为为该缓存密钥选择一个值,确保不会与来自 #result.id 的值发生任何冲突,并使用该值而不是密钥生成器返回的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2020-10-31
    • 2019-11-25
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多