Ответ
Redis — это не просто key-value хранилище, его сила в поддержке различных структур данных в качестве значений. Выбор правильной структуры — ключ к эффективному использованию Redis.
Основные типы данных и команды:
-
Strings (Строки)
- Описание: Бинарно-безопасные строки. Подходят для кэширования HTML, простых значений, счётчиков.
- Команды:
SET,GET,INCR/DECR(атомарные инкремент/декремент),MSET/MGET(установка/получение нескольких ключей за раз).
-
Lists (Списки)
- Описание: Упорядоченная коллекция строк (как в Go
[]string). Идеальны для реализации очередей (FIFO) или стеков (LIFO). - Команды:
LPUSH/RPUSH(добавить в начало/конец),LPOP/RPOP(извлечь из начала/конца),LRANGE(получить срез списка),LLEN(длина списка).
- Описание: Упорядоченная коллекция строк (как в Go
-
Hashes (Хэши)
- Описание: Карта (map) из строковых полей и строковых значений. Отлично подходят для хранения объектов, например, профиля пользователя.
- Команды:
HSET,HGET,HGETALL(получить все поля и значения),HDEL(удалить поле),HINCRBY(инкремент значения поля).
-
Sets (Множества)
- Описание: Неупорядоченная коллекция уникальных строк.
- Команды:
SADD(добавить элемент),SMEMBERS(получить все элементы),SISMEMBER(проверить наличие),SREM(удалить элемент),SINTER/SUNION(пересечение/объединение множеств).
-
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 спрашиваешь! Ну так это же не просто какая-то там шкатулка для ключей-значений, блядь. Это целый ёперный театр структур данных, и если выбрать не ту — сам себе злобный буратино, будешь потом ногами вниз пиздыкаться. Слушай сюда, разжую.
Основные типы, на которых всё держится:
-
Strings (Строки)
- Что это: Обычные строки, бинарно-безопасные. Туда можно запихнуть хоть HTML страницу целиком, хоть число для счётчика.
- Чем тыкать:
SET,GET,INCR/DECR(атомарно плюсануть/минусануть — красота!),MSET/MGET(запихнуть/вытащить кучу ключей разом).
-
Lists (Списки)
- Что это: Упорядоченная коллекция строк, как наш родной
[]stringв Go. Идеально, если тебе нужна очередь (FIFO) типа «первый зашёл — первый вышел» или стек (LIFO) — «последний зашёл, первый вышел, иди нахуй». - Чем тыкать:
LPUSH/RPUSH(запихнуть в начало/конец),LPOP/RPOP(выдернуть из начала/конца),LRANGE(отрезать кусок списка),LLEN(посчитать, сколько там наворочено).
- Что это: Упорядоченная коллекция строк, как наш родной
-
Hashes (Хэши)
- Что это: Наша родная мапа (map), где и ключ — строка, и значение — строка. Прямо созданы, чтобы хранить объекты. Весь профиль пользователя — одним ключом, поля отдельно. Удобно, ёпта!
- Чем тыкать:
HSET,HGET,HGETALL(выгрести всё, как из мешка),HDEL(выкинуть поле нахуй),HINCRBY(плюсануть значение в поле).
-
Sets (Множества)
- Что это: Неупорядоченная куча уникальных строк. Как мешок с шариками, где все шарики разные. Повторов не будет, даже если очень захотеть.
- Чем тыкать:
SADD(кинуть шарик в мешок),SMEMBERS(вывалить весь мешок),SISMEMBER(поковыряться в мешке, есть ли такой шарик),SREM(выкинуть шарик),SINTER/SUNION(найти общие шарики в двух мешках или слить мешки).
-
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()
Вот и вся магия, блядь. Главное — не путай, где список, а где множество, а то получится как у того Герасима: захотел сделать хорошо, а в итоге всех потопил.