Cache em Swift: Redis, Memcached e soluções nativas do A ao Z

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que usar cache em aplicações Swift?

\n

Cache é uma das principais técnicas de otimização de desempenho para aplicações móveis e servidores. No mundo Swift (iOS/macOS), um cache adequado permite reduzir o tempo de carregamento de dados, diminuir a carga na rede e no banco de dados, além de melhorar a experiência do usuário. Neste artigo, abordaremos três abordagens principais para cache em Swift: a solução nativa NSCache, os populares sistemas servidores Redis e Memcached, e sua integração em projetos iOS/macOS.

\n\n

1. Cache nativo: NSCache e URLCache

\n

Para a maioria das aplicações iOS, não são necessários servidores externos — os mecanismos nativos da Apple são suficientes.

\n\n

1.1 NSCache — cache simples e eficiente em memória

\n

NSCache é um dicionário thread-safe que remove objetos automaticamente quando há falta de memória. Ideal para cache de imagens, respostas JSON ou qualquer objeto de computação custosa.

\n
import Foundation\n\nclass ImageCache {\n    private let cache = NSCache<NSString, NSData>()\n\n    func setImageData(_ data: Data, forKey key: String) {\n        cache.setObject(data as NSData, forKey: key as NSString)\n    }\n\n    func getImageData(forKey key: String) -> Data? {\n        return cache.object(forKey: key as NSString) as Data?\n    }\n}
\n

Dica: Configure os limites countLimit e totalCostLimit para um desempenho ideal.

\n\n

1.2 URLCache — cache de requisições de rede

\n

URLCache armazena respostas HTTP em cache no disco e na memória automaticamente. A configuração é feita através de URLSessionConfiguration:

\n
let config = URLSessionConfiguration.default\nconfig.urlCache = URLCache(memoryCapacity: 50 * 1024 * 1024,  // 50 MB\n                           diskCapacity: 100 * 1024 * 1024, // 100 MB\n                           diskPath: "myCache")\nlet session = URLSession(configuration: config)
\n

Isso é especialmente útil para conteúdo estático (imagens, respostas de API com longa vida útil).

\n\n

2. Redis em projetos Swift

\n

Redis é um armazenamento de dados in-memory com suporte a estruturas (strings, listas, hashes). Em projetos Swift Server-side (Vapor, Perfect), Redis é usado para sessões, filas e cache rápido.

\n\n

2.1 Conectando Redis via Vapor

\n

O Vapor fornece o pacote vapor/redis. Instalação:

\n
// Package.swift\ndependencies: [\n    .package(url: "https://github.com/vapor/redis.git", from: "4.0.0")\n]
\n

Exemplo de cache de dados de usuário:

\n
import Vapor\nimport Redis\n\nfunc cacheUser(_ user: User, on request: Request) async throws {\n    let key = "user:\\(user.id)"\n    let data = try JSONEncoder().encode(user)\n    try await request.redis.set(key, to: data)\n    // Configuração de TTL (tempo de vida) de 1 hora\n    try await request.redis.expire(key, after: .hours(1))\n}\n\nfunc getUser(from request: Request, id: Int) async throws -> User? {\n    let key = "user:\\(id)"\n    guard let data = try await request.redis.get(key, as: Data.self) else {\n        return nil\n    }\n    return try JSONDecoder().decode(User.self, from: data)\n}
\n\n

2.2 Vantagens do Redis para Swift

\n
    \n
  • Velocidade: dados armazenados em RAM — latência inferior a um milissegundo.
  • \n
  • TTL: expiração automática de chaves.
  • \n
  • Pub/Sub: comunicação assíncrona entre serviços.
  • \n
\n\n

3. Memcached: cache distribuído leve

\n

Memcached é um sistema de cache mais antigo, mas ainda popular. Ao contrário do Redis, ele não suporta estruturas de dados complexas ou persistência, mas é extremamente simples e eficiente para cache chave-valor.

\n\n

3.1 Integração do Memcached em Swift

Blogs

Book Recommendations