Какие основные типы данных есть в Redis и какие команды для работы с ними вы знаете?

Ответ

Redis — это не просто key-value хранилище, его сила в поддержке различных структур данных в качестве значений. Выбор правильной структуры — ключ к эффективному использованию Redis.

Основные типы данных и команды:

  1. Strings (Строки)

    • Описание: Бинарно-безопасные строки. Подходят для кэширования HTML, простых значений, счётчиков.
    • Команды: SET, GET, INCR/DECR (атомарные инкремент/декремент), MSET/MGET (установка/получение нескольких ключей за раз).
  2. Lists (Списки)

    • Описание: Упорядоченная коллекция строк (как в Go []string). Идеальны для реализации очередей (FIFO) или стеков (LIFO).
    • Команды: LPUSH/RPUSH (добавить в начало/конец), LPOP/RPOP (извлечь из начала/конца), LRANGE (получить срез списка), LLEN (длина списка).
  3. Hashes (Хэши)

    • Описание: Карта (map) из строковых полей и строковых значений. Отлично подходят для хранения объектов, например, профиля пользователя.
    • Команды: HSET, HGET, HGETALL (получить все поля и значения), HDEL (удалить поле), HINCRBY (инкремент значения поля).
  4. Sets (Множества)

    • Описание: Неупорядоченная коллекция уникальных строк.
    • Команды: SADD (добавить элемент), SMEMBERS (получить все элементы), SISMEMBER (проверить наличие), SREM (удалить элемент), SINTER/SUNION (пересечение/объединение множеств).
  5. Sorted Sets (Упорядоченные множества)

    • Описание: Как и множества, хранят уникальные строки, но у каждого элемента есть score (число), по которому коллекция отсортирована. Идеальны для таблиц лидеров (leaderboards), временных шкал.
    • Команды: ZADD (добавить элемент с его score), ZRANGE/ZREVRANGE (получить диапазон по рангу, по возрастанию/убыванию), ZRANGEBYSCORE (получить диапазон по score), ZRANK (узнать ранг элемента).

Общие команды для управления ключами:

  • DEL key1 key2 ...: Удалить один или несколько ключей.
  • EXPIRE key seconds: Установить время жизни (TTL) для ключа.
  • TTL key: Узнать, сколько секунд осталось жить ключу.
  • KEYS pattern: Поиск ключей по шаблону (не рекомендуется в production из-за блокировки сервера).
  • SCAN cursor [MATCH pattern]: Безопасная итерация по ключам, предпочтительнее KEYS.

Пример работы с Redis в Go (библиотека go-redis):

client := redis.NewClient(&redis.Options{
    Addr: "localhost:6379",
})

// Работа со строкой
err := client.Set(ctx, "user:1:name", "Alex", 0).Err()

// Работа с хэшем
err = client.HSet(ctx, "user:1", "email", "alex@example.com").Err()

// Получение данных
name, err := client.Get(ctx, "user:1:name").Result()
email, err := client.HGet(ctx, "user:1", "email").Result()

Ответ 18+ 🔞

А, вот ты про Redis спрашиваешь! Ну так это же не просто какая-то там шкатулка для ключей-значений, блядь. Это целый ёперный театр структур данных, и если выбрать не ту — сам себе злобный буратино, будешь потом ногами вниз пиздыкаться. Слушай сюда, разжую.

Основные типы, на которых всё держится:

  1. Strings (Строки)

    • Что это: Обычные строки, бинарно-безопасные. Туда можно запихнуть хоть HTML страницу целиком, хоть число для счётчика.
    • Чем тыкать: SET, GET, INCR/DECR (атомарно плюсануть/минусануть — красота!), MSET/MGET (запихнуть/вытащить кучу ключей разом).
  2. Lists (Списки)

    • Что это: Упорядоченная коллекция строк, как наш родной []string в Go. Идеально, если тебе нужна очередь (FIFO) типа «первый зашёл — первый вышел» или стек (LIFO) — «последний зашёл, первый вышел, иди нахуй».
    • Чем тыкать: LPUSH/RPUSH (запихнуть в начало/конец), LPOP/RPOP (выдернуть из начала/конца), LRANGE (отрезать кусок списка), LLEN (посчитать, сколько там наворочено).
  3. Hashes (Хэши)

    • Что это: Наша родная мапа (map), где и ключ — строка, и значение — строка. Прямо созданы, чтобы хранить объекты. Весь профиль пользователя — одним ключом, поля отдельно. Удобно, ёпта!
    • Чем тыкать: HSET, HGET, HGETALL (выгрести всё, как из мешка), HDEL (выкинуть поле нахуй), HINCRBY (плюсануть значение в поле).
  4. Sets (Множества)

    • Что это: Неупорядоченная куча уникальных строк. Как мешок с шариками, где все шарики разные. Повторов не будет, даже если очень захотеть.
    • Чем тыкать: SADD (кинуть шарик в мешок), SMEMBERS (вывалить весь мешок), SISMEMBER (поковыряться в мешке, есть ли такой шарик), SREM (выкинуть шарик), SINTER/SUNION (найти общие шарики в двух мешках или слить мешки).
  5. Sorted Sets (Упорядоченные множества)

    • Что это: О, это пиздец как круто! Тоже уникальные строки, но у каждой есть свой score — число. И вся эта куча отсортирована по этому числу. Таблицы лидеров, рейтинги — вот это вот всё.
    • Чем тыкать: ZADD (добавить элемент с его очками), ZRANGE/ZREVRANGE (достать кусок списка от первого к последнему или наоборот), ZRANGEBYSCORE (достать всех, у кого очки в определённом диапазоне), ZRANK (посмотреть, на каком месте твой чувак).

Общие команды, без которых ты как без рук:

  • DEL key1 key2 ...: Снести один или несколько ключей к ебеням.
  • EXPIRE key seconds: Поставить ключу таймер самоуничтожения.
  • TTL key: Посмотреть, сколько секунд ему осталось мучиться.
  • KEYS pattern: Найти ключи по маске (НО НЕ ДЕЛАЙ ТАК НА ПРОДАКШЕНЕ, ОН ЖЕ ЗАВИСНЕТ, БЛЯДЬ!).
  • SCAN cursor [MATCH pattern]: Безопасно итерироваться по ключам, вот это — да.

Пример, как с этим в Go (go-redis) общаться:

client := redis.NewClient(&redis.Options{
    Addr: "localhost:6379",
})

// Работа со строкой
err := client.Set(ctx, "user:1:name", "Alex", 0).Err()

// Работа с хэшем
err = client.HSet(ctx, "user:1", "email", "alex@example.com").Err()

// Получение данных
name, err := client.Get(ctx, "user:1:name").Result()
email, err := client.HGet(ctx, "user:1", "email").Result()

Вот и вся магия, блядь. Главное — не путай, где список, а где множество, а то получится как у того Герасима: захотел сделать хорошо, а в итоге всех потопил.