嘿,
目前正在使用guava对用户进行缓存。所以我的问题是:是否可以使用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));
编辑:
好的,我可以使用 weighter 来限制缓存的大小。对于在线用户,我可以返回 0,对于其他用户则返回 1。这将导致缓存保留在线用户。但如果能够使用 maximumSize 和 expireAfterAccess 就更好了。但是 CacheBuilder.weighter(...) 不会阻止 expireAfterAccess(...) 设置以驱逐旧用户。
编辑:
也许有一些方法可以取消驱逐,但我不确定如何操作 :/
相关文章:从 Guava RemovalListener 重新插入条目是否安全?
Max