adding an lru cache and making use of it in the room member cache
- keeps 25 members from 12 rooms in memory to avoid the cache growing infinitely
This commit is contained in:
parent
cd0b3f567b
commit
e85d7a5ede
|
@ -0,0 +1,27 @@
|
||||||
|
package app.dapk.st.core
|
||||||
|
|
||||||
|
class LRUCache<K, V>(val maxSize: Int) {
|
||||||
|
|
||||||
|
private val internalCache = object : LinkedHashMap<K, V>(0, 0.75f, true) {
|
||||||
|
override fun removeEldestEntry(eldest: MutableMap.MutableEntry<K, V>?): Boolean {
|
||||||
|
return size > maxSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun put(key: K, value: V) {
|
||||||
|
internalCache[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(key: K): V? {
|
||||||
|
return internalCache[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getOrPut(key: K, value: () -> V): V {
|
||||||
|
return get(key) ?: value().also { put(key, it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun size() = internalCache.size
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun LRUCache<*, *>?.isNullOrEmpty() = this == null || this.size() == 0
|
|
@ -1 +1,5 @@
|
||||||
applyMatrixServiceModule(project)
|
applyMatrixServiceModule(project)
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation project(":core")
|
||||||
|
}
|
|
@ -1,5 +1,7 @@
|
||||||
package app.dapk.st.matrix.room.internal
|
package app.dapk.st.matrix.room.internal
|
||||||
|
|
||||||
|
import app.dapk.st.core.LRUCache
|
||||||
|
import app.dapk.st.core.isNullOrEmpty
|
||||||
import app.dapk.st.matrix.common.RoomId
|
import app.dapk.st.matrix.common.RoomId
|
||||||
import app.dapk.st.matrix.common.RoomMember
|
import app.dapk.st.matrix.common.RoomMember
|
||||||
import app.dapk.st.matrix.common.UserId
|
import app.dapk.st.matrix.common.UserId
|
||||||
|
@ -18,7 +20,7 @@ class RoomMembers(private val memberStore: MemberStore, private val membersCache
|
||||||
memberStore.query(roomId, userIds).also { membersCache.insert(roomId, it) }
|
memberStore.query(roomId, userIds).also { membersCache.insert(roomId, it) }
|
||||||
} else {
|
} else {
|
||||||
val (cachedMembers, missingIds) = userIds.fold(mutableListOf<RoomMember>() to mutableListOf<UserId>()) { acc, current ->
|
val (cachedMembers, missingIds) = userIds.fold(mutableListOf<RoomMember>() to mutableListOf<UserId>()) { acc, current ->
|
||||||
when (val member = roomCache[current]) {
|
when (val member = roomCache?.get(current)) {
|
||||||
null -> acc.second.add(current)
|
null -> acc.second.add(current)
|
||||||
else -> acc.first.add(member)
|
else -> acc.first.add(member)
|
||||||
}
|
}
|
||||||
|
@ -42,12 +44,12 @@ class RoomMembers(private val memberStore: MemberStore, private val membersCache
|
||||||
|
|
||||||
class RoomMembersCache {
|
class RoomMembersCache {
|
||||||
|
|
||||||
private val cache = mutableMapOf<RoomId, MutableMap<UserId, RoomMember>>()
|
private val cache = LRUCache<RoomId, LRUCache<UserId, RoomMember>>(maxSize = 12)
|
||||||
|
|
||||||
fun room(roomId: RoomId) = cache[roomId]
|
fun room(roomId: RoomId) = cache.get(roomId)
|
||||||
|
|
||||||
fun insert(roomId: RoomId, members: List<RoomMember>) {
|
fun insert(roomId: RoomId, members: List<RoomMember>) {
|
||||||
val map = cache.getOrPut(roomId) { mutableMapOf() }
|
val map = cache.getOrPut(roomId) { LRUCache(maxSize = 25) }
|
||||||
members.forEach { map[it.id] = it }
|
members.forEach { map.put(it.id, it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue