我们对缓存(Java)有以下要求:
- 缓存项根据淘汰优先级不同具有不同的优先级 - 下列条目的属性将影响此优先级: - 插入或上次使用时间(LRU) - 计算条目所需的资源(在清除时)。该因素会发生变化,因为我们不时地从缓存中获取一个条目并“向其添加信息”,这使得在清除后重新计算它需要更多资源。在此参数上,条目的驱逐优先级非常离散-例如不必支持任何可能的长/双精度值。 我们只需说任何条目在自然数1-10范围内都有一个优先级(仅有10个可能的淘汰优先级值)。 看起来可以使用支持驱逐策略插件的缓存实现来完成。 EHCache似乎支持此功能。 不幸的是,Guava缓存不支持。
但是如果实现实际上只是使用一个内部缓存,在必须进行淘汰时尝试找到停留优先级最低的条目,那么我担心性能和灵活性。如果实现方式是在条目(与缓存一起)注册其新优先级的情况下,当其优先级发生更改时,并且缓存维护一个优先级队列,那么我就不会那么担心。是否有人知道采用此方式的缓存实现?有人知道EHCache实际上在做什么吗?
对于我们实际计算上述两个因素的组合优先级也很困难。很难在“最近使用时间”和“重新计算它所需的资源消耗”之间找到公平的平衡。
目前,我们制作了自己的缓存实现,其中包含一组内部缓存(Guava缓存)。每个内部缓存仅使用LRU淘汰策略。当条目更改为“重新计算其所需的资源消耗”时,它将移动到“下一个”内部缓存。这样,我们就不必计算组合淘汰优先级值,而是可以在每个内部缓存上具有不同的最大大小等。 实际上,我们喜欢这种灵活性,但我们宁愿不自己制作和维护缓存实现。 我们宁愿使用一些开源项目的缓存实现。 有人知道支持此多级内部缓存功能的开源缓存实现吗?或者有没有开源项目想采用我们的实现?
- 缓存项根据淘汰优先级不同具有不同的优先级 - 下列条目的属性将影响此优先级: - 插入或上次使用时间(LRU) - 计算条目所需的资源(在清除时)。该因素会发生变化,因为我们不时地从缓存中获取一个条目并“向其添加信息”,这使得在清除后重新计算它需要更多资源。在此参数上,条目的驱逐优先级非常离散-例如不必支持任何可能的长/双精度值。 我们只需说任何条目在自然数1-10范围内都有一个优先级(仅有10个可能的淘汰优先级值)。 看起来可以使用支持驱逐策略插件的缓存实现来完成。 EHCache似乎支持此功能。 不幸的是,Guava缓存不支持。
但是如果实现实际上只是使用一个内部缓存,在必须进行淘汰时尝试找到停留优先级最低的条目,那么我担心性能和灵活性。如果实现方式是在条目(与缓存一起)注册其新优先级的情况下,当其优先级发生更改时,并且缓存维护一个优先级队列,那么我就不会那么担心。是否有人知道采用此方式的缓存实现?有人知道EHCache实际上在做什么吗?
对于我们实际计算上述两个因素的组合优先级也很困难。很难在“最近使用时间”和“重新计算它所需的资源消耗”之间找到公平的平衡。
目前,我们制作了自己的缓存实现,其中包含一组内部缓存(Guava缓存)。每个内部缓存仅使用LRU淘汰策略。当条目更改为“重新计算其所需的资源消耗”时,它将移动到“下一个”内部缓存。这样,我们就不必计算组合淘汰优先级值,而是可以在每个内部缓存上具有不同的最大大小等。 实际上,我们喜欢这种灵活性,但我们宁愿不自己制作和维护缓存实现。 我们宁愿使用一些开源项目的缓存实现。 有人知道支持此多级内部缓存功能的开源缓存实现吗?或者有没有开源项目想采用我们的实现?
LoadingCache#refresh(key)
。 - Markus Kull