Kotlin中的缓存:Redis、Caffeine及其他解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin中的缓存:Redis、Caffeine及替代方案



缓存是提升应用性能的关键工具之一。在Kotlin中,得益于与Java的兼容性和丰富的JVM生态系统,有众多解决方案可供选择:从轻量级的内存缓存到基于Redis的分布式系统。本文将介绍流行的库、它们的配置以及使用示例。



为什么需要缓存?

缓存的主要目标:

  • 通过将频繁请求的数据存储在快速内存中,降低响应时间(延迟)。
  • 减少数据库和外部API的负载。
  • 在重复请求时节省计算资源。


Kotlin允许使用原生的Java库以及专门的Kotlin封装。



1. 通过Lettuce或Redisson使用Redis

Redis是用于分布式缓存最流行的内存数据存储。在Kotlin中,通过Lettuce(响应式)或Redisson(同步/异步)客户端进行连接。



示例:使用Lettuce进行缓存

// build.gradle.ktsimplementation("io.lettuce:lettuce-core:6.3.1.RELEASE")

// CacheService.ktimport io.lettuce.core.RedisClientimport io.lettuce.core.api.sync.RedisCommands

class RedisCache(private val host: String = "localhost", private val port: Int = 6379) { private val client: RedisClient = RedisClient.create("redis://$host:$port") private val connection = client.connect() private val sync: RedisCommands<String, String> = connection.sync()

fun get(key: String): String? = sync.get(key) fun set(key: String, value: String, ttlSeconds: Long = 60) { sync.setex(key, ttlSeconds, value) } fun delete(key: String) = sync.del(key) fun close() { connection.close() client.shutdown() }}

// 使用fun main() { val cache = RedisCache() cache.set("user:123", """{"name":"Alice","role":"admin"}""", 120) val data = cache.get("user:123") println(data) // {"name":"Alice","role":"admin"} cache.close()}


Redisson — 更高级的API

implementation("org.redisson:redisson:3.27.2")

val config = Config().apply { useSingleServer().setAddress("redis://127.0.0.1:6379")}val redisson = Redisson.create(config)val map = redisson.getMap<String, String>("userCache")map["user:456"] = """{"name":"Bob"}"""val bob = map["user:456"]redisson.shutdown()


2. Caffeine — 快速的内存缓存

Caffeine是Guava Cache的现代替代品。针对高负载进行了优化,支持自动淘汰过期条目。



implementation("com.github.ben-manes.caffeine:caffeine:3.1.8")

import com.github.benmanes.caffeine.cache.Cacheimport com.github.benmanes.caffeine.cache.Caffeineimport java.util.concurrent.TimeUnit

val cache: Cache<String, String> = Caffeine.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) .maximumSize(10_000) .recordStats() .build()

// 写入和读取cache.put("key1", "value1")val value = cache.getIfPresent("key1")println(value) // value1

// 统计信息val stats = cache.stats()println("命中率: ${stats.hitRate()}")


3. Hazelcast — 支持集群的分布式缓存

Hazelcast适用于微服务架构:缓存会在节点之间自动同步。



implementation("com.hazelcast:hazelcast:5.3.6")

import com.hazelcast.core.Hazelcastimport com.hazelcast.map.IMap

val instance = Hazelcast.newHazelcastInstance()val map: IMap<String, String> = instance.getMap("session-cache")map.put("session:token123", "userId=42", 30, TimeUnit.MINUTES)val userId = map.get("session:token123")instance.shutdown()


4. Spring C

推荐