Cacheable 的sync
时间: 2023-10-21 16:04:12 浏览: 37
@Cacheable的sync属性是用来控制缓存是否支持并发访问的。默认情况下,sync属性的值为false,即不支持并发访问。这对于ConcurrentMapCache来说存在缓存并发问题,因为ConcurrentMapCache本身不是线程安全的。但对于GuavaCache来说,sync属性的默认值为true是合理的,因为GuavaCache本身是可以处理并发访问的。
当我们将@Cacheable的sync属性设置为true时,会启用同步机制来保证并发访问的安全性。在这种情况下,使用了GuavaCache的LoadingCache来处理缓存操作,具体涉及到了refreshAfterWrite策略。同时,使用了Cache.get(key, Callable)方法来获取缓存数据,并且在获取数据的过程中可以进行同步操作。
需要注意的是,@Cacheable注解本身并没有提供加锁功能,因此sync属性是否起效取决于具体的缓存实现。在Spring Cache中,具体的缓存实现类会根据sync属性的值来决定是否进行同步操作。
相关问题
Cacheable sync
在使用缓存的时候,可以通过设置@Cacheable的sync属性来实现缓存的同步。sync属性的默认值为false,表示在多线程环境下,多个线程可以同时进入计算,并且可能导致多次计算,而违反了缓存的目的。但是当sync属性设置为true时,底层会将缓存锁住,只有一个线程可以进入计算,其他线程则会被堵塞,直到返回结果更新到缓存中。这样可以保证在多线程环境下只计算一次,并且将结果更新到缓存中。比如在使用@Cacheable注解时可以使用sync属性来实现缓存的同步,例如:@Cacheable(cacheNames="books", key="#map['bookid'].toString()", sync=true) public Book findBook(Map<String, Object> map);<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [ck-jesse#l2cache#二级缓存最佳实践用法1](https://download.csdn.net/download/weixin_35780601/86259627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict](https://blog.csdn.net/yb223731/article/details/107619718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
@Cacheable中的sync
@Cacheable中的sync参数决定了缓存操作是否需要同步。默认情况下,sync参数的值是false,即不进行同步操作。这对于ConcurrentMapCache来说可能存在缓存并发问题,但对于GuavaCache来说是合理的。
如果将sync参数设置为true,将会走到相应的代码逻辑中。在这种情况下,会执行以下操作:1、设置refreshAfterWrite策略;2、设置@Cacheable中的sync属性为true;3、调用Cache.get(key, Callable)方法。
而如果将sync参数设置为false,将会调用findCachedItem()方法,并最终调用org.springframework.cache.Cache.get(key)方法来判断缓存是否存在。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *3* [@Cacheable的sync属性](https://blog.csdn.net/uniquewonderq/article/details/109784592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* [ck-jesse#l2cache#二级缓存最佳实践用法1](https://download.csdn.net/download/weixin_35780601/86259627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]