Scala是否有带容量限制、支持LRU/LFU淘汰的内置内存缓存?
Scala LRU/LFU容量受限缓存实现方案
Scala 标准库本身没有提供内置的、支持容量限制和LRU/LFU淘汰策略的内存缓存类,你可以通过以下两种轻量方案实现,避免封装Future的复杂使用问题:
方案1:基于Java LinkedHashMap实现轻量LRU缓存
该方案无需引入第三方依赖,直接基于JDK内置类改造即可,实现逻辑非常简单:
import java.util.LinkedHashMap import scala.jdk.CollectionConverters._ class LRUCache[K, V](maxCapacity: Int) { // 第三个参数true表示按访问顺序排序,天然符合LRU特性 private val cache = new LinkedHashMap[K, V](16, 0.75f, true) { override def removeEldestEntry(eldest: java.util.Map.Entry[K, V]): Boolean = { // 容量超过上限时自动淘汰最久未访问的键 size() > maxCapacity } }.asScala def get(key: K): Option[V] = cache.get(key) def put(key: K, value: V): Unit = cache.put(key, value) def remove(key: K): Unit = cache.remove(key) def size: Int = cache.size }
- 无额外依赖,使用方式和普通Map完全一致,没有Future封装
- 仅支持LRU淘汰策略,适合简单缓存场景使用
方案2:基于Guava Cache实现灵活的LRU/LFU缓存
如果需要LFU策略、过期时间、访问统计等更丰富的能力,可以引入Guava工具库的CacheBuilder实现,使用方式也非常简洁:
import com.google.common.cache.{CacheBuilder, CacheLoader, LoadingCache} import java.util.concurrent.TimeUnit // LRU缓存示例 def buildLruCache[K, V](maxCapacity: Int, loader: K => V): LoadingCache[K, V] = { CacheBuilder.newBuilder() .maximumSize(maxCapacity) // 容量上限,超出后按LRU规则淘汰 .build[K, V](new CacheLoader[K, V] { override def load(key: K): V = loader(key) }) } // LFU缓存示例 def buildLfuCache[K, V](maxCapacity: Int, loader: K => V): LoadingCache[K, V] = { CacheBuilder.newBuilder() .maximumWeight(maxCapacity) // 按访问权重计数实现LFU .weigher((_: K, _: V) => 1) .build[K, V](new CacheLoader[K, V] { override def load(key: K): V = loader(key) }) }
- 支持LRU、LFU两种淘汰策略,可自由配置写入过期、访问过期等附加能力
- 接口简单无强制Future封装,同步获取缓存值直接调用
get(key)即可
内容的提问来源于stack exchange,提问作者Pratap D
相关产品推荐
相关产品推荐

