Spring 中的
@Cacheable
注解在第一次调用时运行该方法,然后缓存结果。 供将来参考,它实际上并不运行该方法,只是返回缓存的结果。
同步参数表示:
如果有多个线程,则同步底层方法的调用 正在尝试加载同一个键的值。
所以我的问题是何时应用此同步?是否仅在第一次调用期间,因为此后该方法实际上并未被调用?为什么
@Cacheable
同步而@CachePut
不同步?
和@Cacheable
之间的区别在于@CachePut
将跳过运行该方法,而@Cacheable
将实际运行 方法,然后将其结果放入缓存中。@CachePut
将同步与实际运行该方法并更新缓存的注释一起使用更有意义,即
@CachePut
。既然@Cacheable
无法更新缓存中现有的条目,为什么我们需要同步?我在这里缺少什么?幕后发生的过程是什么?
@Cacheable
注释中的sync属性管理当多个线程尝试同时访问同一缓存键时如何同步缓存操作。
sync = true
:如果多个线程请求相同的缓存键
尚未缓存,只有一个线程会执行该方法
加载缓存。其他线程等待直到缓存被填充并且
然后返回缓存的结果。这确保了缓存仅被加载
对于该密钥一次,避免冗余执行。sync = false
(默认):多个线程可以访问
方法并在缓存为空时同时计算值。
这可能会导致同一键的重复执行,当多个
线程同时请求未缓存的值。