请随时纠正我。
构建需要时间排序的市场数据缓存的场景(即按时间元素排序)。缓存将有很多更新。
逻辑规定List是一个合理的选择,因为索引是免费的,并且易于执行getOldestElem list.get(0);二分搜索等。
这个缓存将由多个线程使用,显然是读取和更新指向CopyOnWriteArrayList的缓存。 (Javadoc表示这不适合大尺寸和频繁更新)
我正在寻找替代或更好的想法?
答案 0 :(得分:3)
如果现有记录很少(或永远不会)更新,那么“频繁更新”是经常添加的,您可以使用时间顺序通过分离旧元素和新元素来优化数据结构。
例如,您可以将缓存分段为多个CopyOnWriteArrayList
个对象,每个对象不超过固定数量的元素,每个段包含数据的时间子范围。频繁添加将增加最后一个段,直到达到最大大小,此时您将为后续更新附加新段。通过保持最大段大小足够小,可以避免CopyOnWriteArrayList
的性能问题。您应该在自己的List
类中隐藏实现细节。
修改强> 删除旧元素同样只改变一个段:最旧的段。
答案 1 :(得分:2)
最适合测试您的使用案例,但受ReadWriteLock
保护的ArrayList
可能会为您提供更好的效果。