【发布时间】:2013-07-23 14:41:42
【问题描述】:
嘿嘿,
目前使用 guava 来缓存用户。所以我的问题是,如果缓存对象具有特定的属性值,是否可以使用番石榴来限制驱逐条目。例如,如果 user.isOnline() 返回 true,则即使在特定时间内没有访问用户(.expireAfterAccess(KEEP_LOADED, TimeUnit.SECONDS)),用户也不会被驱逐。
编辑:
我在 CacheBuilder.weighter(...) 的 javadoc 中找到了这个:
当一个条目的权重为零时,它不会被考虑基于大小的驱逐(尽管它仍然可以通过其他方式驱逐)。
但是,如果我的用户在线,我不想以任何方式驱逐他。
基本上我这样缓存我的用户:
this.cache = CacheBuilder.newBuilder()
.maximumSize(MAX_CACHED_USERS)
.expireAfterAccess(KEEP_LOADED, TimeUnit.SECONDS)
.build(new UserLoader(core));
编辑:
好的,我可以使用权重来限制缓存的大小。对于每个在线的用户,我可以返回 0,对于其他每个用户,我都可以返回 1。这将导致缓存保留在线用户。但是如果使用 maximumSize 和 expireAfterAccess 会更好。但是 CacheBuilder.weighter(...) 不会阻止 expireAfterAccess(...) 设置驱逐老用户。
编辑:
也许可以通过某种方式取消驱逐,但我不确定如何:/
相关:Is it safe to reinsert the entry from Guava RemovalListener?
最大
【问题讨论】:
-
你能展示一下你是如何使用 Guava 来缓存用户以便我们有更多的上下文吗?
-
在您的 CacheLoader 实现上编写一个 reload 方法,该方法返回给定的 user.isOnline() 的“旧”实例为真。
-
@Ray soo reload() 在缓存对象被驱逐时调用?
-
因为 javadocs 中没有信息:计算或检索与已缓存键对应的替换值。当 CacheBuilder.refreshAfterWrite 或通过调用 LoadingCache.refresh 刷新现有缓存条目时调用此方法。
-
不,没有办法像您尝试那样做。不过,当用户离线时,您几乎应该使用明确的
invalidate。