You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:39:00