Skip to content

KV Store

Key-value хранилище с изоляцией по плагинам. Данные сохраняются между вызовами. У каждого плагина изолированное пространство ключей - коллизии между плагинами невозможны.

Базовые операции

go
// Запись
err := ctx.KVSet("counter", "42")

// Чтение
value, found, err := ctx.KVGet("counter")
if found {
    fmt.Println(value) // "42"
}

// Удаление
err := ctx.KVDelete("counter")

// Список ключей по префиксу
keys, err := ctx.KVList("user:")
// keys: ["user:1", "user:2", "user:admin"]

Поддержка TTL

Установка автоматического времени жизни ключа:

go
err := ctx.KVSetWithTTL("session", data, 30*time.Minute)

После истечения TTL ключ автоматически удаляется. Повторный KVGet вернёт found == false.

Справочник API

МетодСигнатураОписание
KVGet(key string) (string, bool, error)Получить значение. bool - найден ли ключ
KVSet(key, value string) errorУстановить значение (без TTL)
KVSetWithTTL(key, value string, ttl time.Duration) errorУстановить значение с TTL
KVDelete(key string) errorУдалить ключ
KVList(prefix string) ([]string, error)Список ключей по префиксу

Необходимое требование:

go
wasmplugin.KV("Кеширование данных")

KV в миграциях

MigrateContext также предоставляет KV-методы для трансформации данных при обновлении версии:

go
Migrate: func(ctx *wasmplugin.MigrateContext) error {
    val, found, _ := ctx.KVGet("old_key")
    if found {
        ctx.KVSet("new_key", val)
        ctx.KVDelete("old_key")
    }
    return nil
},

Пример: счётчик вызовов

go
Handler: func(ctx *wasmplugin.EventContext) error {
    val, found, err := ctx.KVGet("call_count")
    if err != nil {
        return err
    }

    count := 0
    if found {
        count, _ = strconv.Atoi(val)
    }
    count++

    if err := ctx.KVSet("call_count", strconv.Itoa(count)); err != nil {
        return err
    }

    ctx.Reply(fmt.Sprintf("Вызов #%d", count))
    return nil
}

Значения - строки

Значения KV - строки. Сериализуйте сложные данные в JSON перед сохранением.