2

我在我的 Android 应用程序中使用 LRU 缓存(LruCache来自的类)。android.util这通常工作正常。

现在我对这个 LRU 缓存有一个特殊要求:我希望某些对象永远不会被删除。解释情况:我有一个永远不应删除的对象数组(名为mymetadata对象),我还有许多其他对象(名为dynamicdata对象)应使用 LRU 规则删除。我想将mymetadata对象存储在 LRU 缓存中,因为对象数组也可以增长,并且使用 LRU 缓存有助于避免内存不足。

是否有任何技巧可以保证mymetadata对象永远不会从 LRU 缓存中删除?还是我应该简单地从数组中访问一个对象,以便将其标记为上次使用?

4

1 回答 1

1

有什么技巧可以保证永远不会从 LRU 缓存中删除mymetadata吗?或者我应该简单地访问数组的一个对象并将其标记为上次使用?

除了定期触摸您想保留在 LRU 缓存中的对象(以强制提高它们的等级)之外,我看不出还有什么可以做的。一个问题可能是何时应该触摸这些对象以及此操作对性能的影响是什么?

另一种方法是根据对象的持久性来拆分对象的存储。为您的持久对象保留一个标准映射,并为可能过期的对象保留一个 LRU 缓存。然后可以将两种数据结构的这种混合隐藏在类似于Mapor的单个接口后面LruCache(每个查询都指向正确的内部存储)。

我想将mymetadata对象放入 LRU 缓存中,因为对象数组也可以增长

这似乎与您对某些对象的“永不删除”要求相冲突。您如何决定何时允许持久对象过期?

无论如何,另一种方法是重新实现 LRU 缓存数据结构,保留两个单独的有序对象列表而不是一个:一个用于mymetadata对象,一个用于动态数据对象。然后对该数据结构的每个查询都指向正确的列表,并且两种对象都可以独立过期(也可以为每组对象独立选择缓存的大小)。但是这两种对象都存储在同一个哈希表/映射中。

于 2014-02-08T15:35:58.180 回答