Evict在Spring启动时不起作用

时间:2017-10-14 17:18:14

标签: spring spring-boot ehcache spring-cache

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

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

CachedMethod: -

 @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时,我想要将带有key =“cacheKeyGenerator”的缓存“appCache”中的数据逐出。所以方法“showAllContacts()”返回的数据是准确的。任何人都可以帮忙!

可以在 - https://github.com/iftekharkhan09/SpringCaching

找到整个代码

1 个答案:

答案 0 :(得分:0)

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

@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中的值发生任何冲突,并使用该值而不是返回的密钥生成器之一。