Spring @Cacheable,除非由自定义密钥生成器创建的属性引用密钥

时间:2019-07-24 18:48:32

标签: java spring caching

我有以下getLoggedInCustomer服务,该服务很慢,并且正在通过自定义密钥生成器使用缓存(该缓存使用了JWT令牌中的多个字段)

(用于监视)的新要求是我们不想缓存一些客户。例如,我们不想在生成的缓存密钥为123

的地方缓存客户

我能做到这一点的唯一方法是将生成的缓存键包含到结果中,并在unless的{​​{1}}字段中引用它,如下所示:

@Cacheable

是否有可能在不将生成的缓存键包含到结果对象中的情况下做到这一点?

1 个答案:

答案 0 :(得分:0)

@Service
@Log4j2
@CacheConfig(keyGenerator = "customKeyGenerator")
class CustomerService {

    @Cacheable(value = "customers", unless = "@monitoring.monitoringUser()")
    public Customer getLoggedInCustomer() {
        return repository.getLoggedInCustomer; // slow 
    }

}

monitoringUser的来源

@Component(value = "monitoring")
@Log4j2
class Monitoring {

    @Value("${caching.disable.users:#{T(java.util.Collections).emptyList()}}")
    private List<String> users;

    public boolean monitoringUser() {
        String name = SecurityContextHolder.getContext().getAuthentication().getName();

        // do not cache
        if (users.contains(name)) return true;

        return false;
    }
}

此处有更多详细信息:

https://zoltanaltfatter.com/2019/07/24/conditional-caching/