0

我想为每个 userId 缓存以下数据实体映射对象。

/**
 * Example data object
 */
data class Data(
  val id: Int,
  val name: String,
  val age: Int
)

作为想法之一,我考虑了 Caffeine 中的以下缓存。

/**
 * Ex.1 cache
 * userId to (dataId to Data)
 */
val userDataCache = Caffeine.newBuilder()
  .build<Int, ConcurrentHashMap<Int, Data>>()

/**
 * invalidate by userId
 */
fun invalidate(userId: Int) {
  userDataCache.invalidate(userId)
}

但是,上面示例中的 userDataCache 不是线程安全的,因为它被定义为嵌套的 hashmap。

我准备了另一个想法来使它成为线程安全的。

/**
 * Ex.2 cache
 * Pair(userId, dataId) to Data
 */
val userDataCache = Caffeine.newBuilder()
  .build<Pair<Int, Int>, Data>()

/**
 * invalidate by userId
 */
fun invalidate(userId: Int) {
  TODO("No idea !!!")
}

此方法是线程安全的,因为它不使用嵌套的 hashmap。

但是,这种方法不允许我们定义一个 invalidate 方法来使每个 userId 的缓存失效。

如何以满足以下要求的方式使用 Caffeine Cache 或 ConcurrentHashMap?

  • 缓存每个 userId 的数据映射
  • 使每个 userId 的数据映射无效
  • 使其成为线程安全的
4

0 回答 0