我想为每个 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 的数据映射无效
- 使其成为线程安全的