Cache em Kotlin: Redis, Memcached e soluções embutidas: de A a Z
\n\nAplicações modernas em Kotlin exigem alta velocidade de resposta e processamento eficiente de dados. Uma das ferramentas-chave para alcançar esse objetivo é o cache. Neste artigo, abordaremos três abordagens: uso de Redis, Memcached e soluções embutidas no nível da JVM. Você aprenderá como escolher a estratégia correta e obterá exemplos de código prontos para integração em seu projeto.
\n\n1. Cache embutido em Kotlin (In-Memory Cache)
\n\nA maneira mais simples é usar cache dentro da aplicação. Em Kotlin (rodando na JVM), você pode utilizar coleções padrão ou bibliotecas especializadas, como Caffeine ou Guava Cache.
\n\nExemplo com Caffeine (recomendado)
\nAdicione a dependência em build.gradle.kts:
implementation("com.github.ben-manes.caffeine:caffeine:3.1.8")\n\nCrie um serviço de cache:
\nimport com.github.benmanes.caffeine.cache.Cache\nimport com.github.benmanes.caffeine.cache.Caffeine\nimport java.util.concurrent.TimeUnit\n\nclass UserCache {\n private val cache: Cache<String, User> = Caffeine.newBuilder()\n .expireAfterWrite(10, TimeUnit.MINUTES)\n .maximumSize(1000)\n .build()\n\n fun getUser(id: String): User? = cache.getIfPresent(id)\n\n fun putUser(id: String, user: User) {\n cache.put(id, user)\n }\n}\n\nVantagens: latência mínima, sem chamadas de rede, facilidade de configuração.
\nDesvantagens: o cache é perdido ao reiniciar a aplicação, limitado pela memória da JVM.
2. Cache com Redis em Kotlin
\n\nRedis é um poderoso armazenamento in-memory que suporta estruturas de dados complexas. Ideal para sistemas distribuídos.
\n\nConfiguração via Spring Data Redis
\nAdicione a dependência:
\nimplementation("org.springframework.boot:spring-boot-starter-data-redis")\nimplementation("org.jetbrains.kotlin:kotlin-reflect")\n\nConfiguração (application.yml):
\nspring:\n redis:\n host: localhost\n port: 6379\n timeout: 2000ms\n lettuce:\n pool:\n max-active: 8\n max-idle: 4\n\nExemplo de serviço com anotações Spring Cache:
\nimport org.springframework.cache.annotation.Cacheable\nimport org.springframework.stereotype.Service\n\n@Service\nclass ProductService {\n\n @Cacheable("products", key = "#id")\n fun getProduct(id: Long): Product {\n println("Carregando do BD: $id")\n return Product(id, "Produto $id")\n }\n}\n\nPara trabalhar com Redis diretamente (sem Spring):
\nimport io.lettuce.core.RedisClient\nimport io.lettuce.core.api.sync.RedisCommands\n\nclass RedisCache {\n private val commands: RedisCommands<String, String>\n\n init {\n val client = RedisClient.create("redis://localhost:6379")\n commands = client.connect().sync()\n }\n\n fun set(key: String, value: String, ttlSeconds: Long = 300) {\n commands.setex(key, ttlSeconds, value)\n }\n\n fun get(key: String): String? = commands.get(key)\n}\n\nVantagens: cache distribuído, persistência, suporte a TTL e estruturas complexas.
\nDesvantagens: requer um servidor separado, latência ligeiramente maior (chamada de rede).
3. Cache com Memcached em Kotlin
\n\nMemcached é um armazenamento distribuído leve, otimizado para armazenar pequenos objetos em memória.
\n\nConexão via biblioteca xmemcached
\nAdicione em build.gradle.kts:
implementation("com.googlecode.xmemcached:xmemcached:2.4.8")\n\nExemplo de uso:
\nimport net.rubyeye.xmemcached.MemcachedClient\nimport net.rubyeye.xmemcached.XMem