Kotlin 中的缓存:Redis、Memcached 及内置解决方案 — 从 A 到 Z
缓存是提升应用程序性能的关键工具之一。在运行于 JVM 和 Android 之上的 Kotlin 生态系统中,开发者可以使用多种解决方案:从分布式系统(Redis、Memcached)到内置本地缓存(Caffeine、Guava Cache、Ehcache)。在本文中,我们将分析如何将每种方案集成到 Kotlin 项目中,提供代码示例并给出选择建议。
1. JVM 内置缓存:Caffeine 和 Guava Cache
对于 Kotlin 中的本地缓存,Caffeine 是最佳选择——这是一个用 Java 编写的高性能库,与 Kotlin 完全兼容。它支持基于时间、大小和权重的自动淘汰。另一种选择是 Google 的 Guava Cache,但 Caffeine 速度更快(通常快 2-3 倍)。
示例:Caffeine + Kotlin
在 build.gradle.kts 中添加依赖:
implementation("com.github.ben-manes.caffeine:caffeine:3.1.8")创建一个最多包含 1000 个元素、TTL 为 10 分钟的缓存:
import com.github.benmanes.caffeine.cache.Caffeineimport java.util.concurrent.TimeUnit
val cache = Caffeine.newBuilder() .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES) .build<String, String>()
// 使用cache.put("user:42", "{\\"name\\":\\"Alice\\"}")val user = cache.getIfPresent("user:42")println(user) // {"name":"Alice"}示例:Guava Cache + Kotlin
implementation("com.google.guava:guava:33.0.0-jre")import com.google.common.cache.CacheBuilderimport java.util.concurrent.TimeUnit
val guavaCache = CacheBuilder.newBuilder() .maximumSize(500) .expireAfterWrite(5, TimeUnit.MINUTES) .build<String, String>()
guavaCache.put("session:abc", "active")println(guavaCache.getIfPresent("session:abc")) // active何时使用:用于存储单个应用程序实例的临时数据(例如,复杂计算的结果、令牌、配置)。不适用于具有多个实例的微服务——数据不会同步。
2. Redis — 用于微服务的分布式缓存
Redis 是一个内存中的键值存储,用作分布式缓存、消息代理和数据库。对于 Kotlin,最好的客户端是 Lettuce(异步、响应式、线程安全)。
安装与连接
implementation("io.lettuce:lettuce-core:6.3.2.RELEASE")示例:连接与基本操作
import io.lettuce.core.RedisClientimport io.lettuce.core.api.sync.RedisCommands
val client = RedisClient.create("redis://localhost:6379")val connection = client.connect()val commands: RedisCommands<String, String> = connection.sync()
// 设置键,TTL 为 60 秒commands.setex("user:123", 60, "{\\"name\\":\\"Bob\\"}")
// 读取val data = commands.get("user:123")println(data) // {"name":"Bob"}
connection.close()client.shutdown()示例:响应式客户端(Kotlin 协程)
import io.lettuce.core.RedisClientimport io.lettuce.core.api.reactive.RedisReactiveCommandsimport kotlinx.coroutines.reactive.awaitFirstOrNull
suspend fun getFromRedis(key: String): String? { val client = RedisClient.create("redis://localhost:6379") val connection = client.connect() val reactive: RedisReactiveCommands<String, String> = connection.reactive()
val result = reactive.get(key).awaitFirstOrNull() connection.close() client.shutdown() return result}何时使用:分布式系统、微服务、共享会话、速率限制、发布/订阅消息传递。