Redis клиент для Kotlin: Lettuce и Kreds — сравнение и примеры

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Redis клиент для Kotlin: обзор и сравнение популярных библиотек

Redis — это высокопроизводительное хранилище данных типа «ключ-значение», которое широко используется для кэширования, сессий, очередей и real-time приложений. Для языка Kotlin существует несколько зрелых клиентов, которые позволяют эффективно взаимодействовать с Redis. В этой статье мы рассмотрим две основные библиотеки: Lettuce (асинхронный, неблокирующий) и Kreds (специализированный для Kotlin с поддержкой корутин).

1. Lettuce — мощный и гибкий клиент для JVM

Lettuce — это асинхронный Redis клиент на Java, который отлично работает в Kotlin-проектах. Он поддерживает синхронный, асинхронный (на CompletableFuture) и реактивный (Project Reactor / RxJava) API. Lettuce является одним из самых популярных решений для Spring Boot и микросервисов.

Подключение (Gradle)

dependencies {
    implementation("io.lettuce:lettuce-core:6.3.2.RELEASE")
}

Пример синхронного подключения и операций

import io.lettuce.core.RedisClient
import io.lettuce.core.api.sync.RedisCommands

fun main() {
    val client = RedisClient.create("redis://localhost:6379")
    val connection = client.connect()
    val commands: RedisCommands<String, String> = connection.sync()

    // Установка и получение значения
    commands.set("mykey", "Hello from Lettuce!")
    val value = commands.get("mykey")
    println("Value: $value") // Hello from Lettuce!

    // Работа с хешами
    commands.hset("user:1", "name", "Alice")
    commands.hset("user:1", "age", "30")
    val name = commands.hget("user:1", "name")
    println("User name: $name")

    connection.close()
    client.shutdown()
}

Асинхронный режим с корутинами

Lettuce поддерживает асинхронный API через CompletableFuture, который легко адаптировать для Kotlin корутин с помощью await():

import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.future.await

fun main() = runBlocking {
    val client = RedisClient.create("redis://localhost:6379")
    val connection = client.connect()
    val asyncCommands = connection.async()

    val result = asyncCommands.set("coroutine-key", "Kotlin + Lettuce").await()
    println("Set result: $result")

    val value = asyncCommands.get("coroutine-key").await()
    println("Value: $value")

    connection.close()
    client.shutdown()
}

2. Kreds — Kotlin-first клиент с корутинами

Kreds — это современный Redis клиент, написанный полностью на Kotlin. Он изначально поддерживает корутины, Flow и сериализацию через kotlinx.serialization. Kreds использует Netty под капотом, но предоставляет чистый Kotlin API.

Подключение (Gradle)

dependencies {
    implementation("io.ktor:kreds:0.9.0")
}

Пример базового использования

import io.kreds.client.RedisClient

suspend fun main() {
    val client = RedisClient("localhost", 6379)

    client.set("kreds-key", "Hello from Kreds!")
    val value = client.get("kreds-key")
    println("Value: $value")

    // Работа со списками
    client.lpush("mylist", "A", "B", "C")
    val item = client.rpop("mylist")
    println("Popped: $item")

    client.close()
}

Использование Flow для подписки на каналы

Kreds поддерживает Pub/Sub через Kotlin Flow, что удобно для реактивных приложений:

import io.kreds.client.RedisClient
import kotlinx.coroutines.flow.collect

suspend fun main() {
    val client = RedisClient("localhost", 6379)

    client.subscribe("channel-1").collect { message ->
        println("Received: ${message.payload}")
    }
}

3. Сравнение Lettuce и Kreds

Характеристика Lettuce Kreds
Язык реализации Java Kotlin
Асинхронность CompletableFuture, Reactor, RxJava Корутины, Flow
Поддержка кластеризации Да (Cluster, Sentinel) Ограниченная
Сериализация Только строки (можно обернуть)

Рекомендаций