英文:
Guava cache behavior for requests when an async reload thread is already in progress
问题
从石榴文档此处中可以看到,当收到一个缓存键的请求,且刷新时间已过期,它会启动一个异步线程来刷新键(如果是这样设置的),并返回现有值。但我从文档中没有找到的信息是,如果第一个请求之后立即收到另一个请求,而之前用于刷新的异步线程仍在运行,会发生什么?它会 -
- 返回旧数据,并启动另一个用于刷新的异步线程,或者
- 它会察觉到另一个刷新线程正在运行,只是返回旧数据,而不会启动新线程。
如果是第一种行为,我会担心如果请求速率非常高,它可能会在后台使用大量资源。
英文:
From the guava documentation here , when a request is received for a cache key for which refresh time has expired, it starts an asynchronous thread to refresh the key if it is setup that way and returns the existing value. What I did not get from the documentation is what happens when another request is received immediately after the first one and the previous async thread for refresh is still running? Will it -
- Return the old data AND start another async thread for refresh OR
- It sees another refresh thread is running and it just returns the old data without spawning a new thread.
If the behavior is first one, I would be concerned if the request rate is very high, it might end up utilizing significant resources in the background.
答案1
得分: 2
注意,关于refreshAfterWrite
的JavaDoc说明如下:
> 刷新操作的语义在LoadingCache.refresh(K)中进行了说明。
这澄清了其行为,如下:
> 如果另一个线程当前正在为{@code key}加载值,则不执行任何操作。如果与此缓存关联的缓存加载器异步执行刷新操作,则该方法可能会在刷新完成之前返回。
该缓存足够智能,能够执行(2),你可以通过编写一个简单的单元测试来轻松验证。
英文:
Note that the JavaDoc for refreshAfterWrite
states,
> The semantics of refreshes are specified in LoadingCache.refresh(K)
This clarifies the behavior as,
> Returns without doing anything if another thread is currently loading the value for {@code key}. If the cache loader associated with this cache performs refresh asynchronously then this method may return before refresh completes.
The cache is smart enough to do (2) and you could easily verify that by writing a simple unit test.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论