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:
Adam Brown 2022-05-08 14:55:52 +01:00
parent cd0b3f567b
commit e85d7a5ede
3 changed files with 39 additions and 6 deletions

View File

@ -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

View File

@ -1 +1,5 @@
applyMatrixServiceModule(project) applyMatrixServiceModule(project)
dependencies {
implementation project(":core")
}

View File

@ -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) }
} }
} }