Redis (быстрый блокнот у официанта)
На пальцах
Представь ресторан с несколькими официантами. У каждого в руках не просто блокнот, а волшебный: пишешь в него «заказ столика 7 — борщ» — и любой другой официант тут же это видит. Хочешь узнать, что заказывал столик 7 — открыл блокнот, прочитал, мгновенно. Без похода на кухню, без поиска по картотеке. Сам он ничего не готовит, но без него все бегали бы к повару за каждым пустяком. Redis — такой блокнот для сервера: хранит небольшие кусочки данных (записи, числа, списки) и отдаёт их за миллисекунды.
Что это
Программа, которая держит данные прямо в оперативной памяти сервера (потому и быстрая — обычные базы данных читают с диска, а это из оперативки) и отдаёт их по ключу — как блокнот, в котором записи ищут по имени. Умеет хранить не только строки, но и списки, множества, счётчики, очереди задач.
Зачем
Например, у интернет-магазина каталог товаров лежит в базе данных — это «кухня»: большая, надёжная, но каждое обращение к ней занимает время. Каждый раз, когда посетитель открывает страницу, сервер идёт на «кухню» за одним и тем же товаром — картинкой, ценой, описанием. Получается очередь и задержки. Redis ставится рядом как «быстрый блокнот»: первый запрос идёт на кухню, кладёт ответ в блокнот, а дальше все следующие посетители получают данные из блокнота за миллисекунды. Кроме того, Redis хранит сессии (кто из пользователей залогинен), короткие очереди задач (отправить письмо, обработать заказ) и счётчики (сколько товаров осталось, сколько человек на сайте прямо сейчас).
Ещё Redis умеет:
- сам удалять записи через заданное время (TTL — время жизни), чтобы блокнот не разрастался в помойку
- рассылать сообщения между частями приложения (pub/sub) — как официант, который кричит «борщ готов!», и все, кому надо, сразу слышат
- сохранять данные на диск (RDB-снимки и AOF-журнал), чтобы после перезапуска сервера блокнот не оказался чистым
- считать на лету (атомарные операции, например INCR — увеличить на единицу): сколько раз посмотрели товар, сколько лайков у поста
- запускать маленькие скрипты прямо у себя (Lua), чтобы не дёргать «кухню» по мелочам
- работать как простая очередь задач (streams): одно событие записали — другой сервис его прочитал и обработал