Ось готовий урок, згенерований у стилі CS50, спеціально для твого запиту.
🎓 CS50: Redis. Ключі та типи даних
Привіт, друзі! Мене звати [Твоє Ім'я], і це... Redis.
Сьогодні ми не просто вивчимо ще одну базу даних. Ми навчимося працювати з швидкістю думки. Ми розберемося, як організувати хаос даних так, щоб діставати потрібне за мілісекунди. Готові? Поїхали!
1. 🔥 Вступ: Проблема «Швейцарського ножа»
Уявіть, що ви прийшли до величезного гардероба на стадіоні. Ви здаєте куртку, рюкзак і парасольку.
Якби гардеробник працював як звичайний текстовий файл, він би скинув усі ваші речі в одну величезну купу посеред кімнати. Коли ви повернетесь, він скаже: "Чекай, зараз перекопаю цю гору і знайду твій шарф". Це повільно. Це неефективно.
Але Redis працює інакше. Він дає вам номерок (Ключ). Ви повертаєтесь, кажете "Номерок 42", і гардеробник миттєво — бам! — простягає ваші речі.
Але тут виникає питання: А що саме лежить за номерком 42? * Тільки куртка? (Рядок) * Стопка газет? (Список) * Набір унікальних марок? (Множина) * Або, можливо, ціла валіза з відділеннями для шкарпеток і краваток? (Хеш)
У більшості баз даних ми звикли до таблиць. У Redis таблиць немає. Є Ключ (Label) і Значення (Value). Але якщо ми будемо все пхати в рядки, це буде так само незручно, як їсти суп виделкою.
Питання до вас: Як нам зберігати лайки користувачів, їхні останні повідомлення та кошик покупок так, щоб це працювало миттєво, навіть якщо у нас мільйон користувачів онлайн?
Відповідь проста: Правильний тип даних для правильної задачі.
2. 🧠 Теоретична база (Під капотом)
Redis (Remote Dictionary Server) — це, по суті, гігантська хеш-мапа (Hash Map) у пам'яті.
🔑 Ключ (Key) — Це ваша адреса
Це те, як ми знаходимо дані.
* Ключ — це завжди рядок (String).
* Він має бути унікальним.
* Запам’ятайте: Ключ — це єдиний спосіб дістатися до даних. Немає SELECT * WHERE city = 'Kyiv'. Є тільки GET user:100:city.
📦 Типи Значень (Data Types) — Це контейнери
Ось 5 основних типів, які ви мусите знати (уявіть їх як різний посуд на кухні):
-
String (Рядок) — Звичайна тарілка.
- Найпростіший тип.
- Може зберігати текст ("Hello"), числа (42), або навіть бінарні дані (картинку JPEG).
- Навіщо: Кешування сторінок, лічильники, прості сесії.
-
List (Список) — Труба або черга.
- Впорядкований набір рядків.
- Можна додати зліва, можна справа.
- Навіщо: Стрічка новин, черга задач (Job Queue), "останні 10 коментарів".
-
Set (Множина) — Мішок.
- Невпорядкований набір.
- Головна фішка: Унікальність. Якщо кинути туди "Apple" двічі, другий раз він просто зникне.
- Навіщо: Список IP-адрес, які відвідали сайт (нам не треба дублікати), теги, друзі.
-
Hash (Хеш) — Органайзер.
- Це як "словник усередині словника". Ключ -> (Поле -> Значення).
- Ідеально для об'єктів.
- Навіщо: Профіль користувача (ім'я, вік, email).
-
Sorted Set (Впорядкована множина) — Дошка пошани.
- Як Set (унікальний), але кожен елемент має "вагу" (Score).
- Redis автоматично тримає їх відсортованими.
- Навіщо: Таблиці лідерів (Leaderboards), черга з пріоритетами.
Інтуїтивно: Redis — це не просто "склад". Це "розумний склад", який знає структуру ваших даних і дозволяє маніпулювати ними (сортувати, різати, додавати) прямо в пам'яті сервера, не ганяючи зайві байти мережею.
3. 🧪 Приклади (Live Coding)
Давайте заглянемо в термінал (redis-cli).
Приклад 1: Простий рядок (String)
Я хочу зберегти ім'я користувача.
> SET user:1 "Ivan"
OK
> GET user:1
"Ivan"
Просто, правда? А тепер магія. Якщо це число, Redis дозволяє робити математику атомарно!
> SET views:video:55 100
OK
> INCR views:video:55
(integer) 101
Чому це круто? Жодного "прочитав, додав в умі, записав назад". Redis робить це сам. Ніяких Race Conditions.
Приклад 2: Об'єкт (Hash) — Типовий профіль
Уявіть, що нам треба зберегти дані про Івана. Ми могли б зробити це через JSON у рядку, але тоді, щоб змінити лише вік, нам довелося б перезаписувати весь об'єкт. Використаємо Hash:
> HSET user:100 name "Ivan" age 25 email "ivan@cs50.net"
(integer) 3
Як отримати тільки вік?
> HGET user:100 age
"25"
Отримати все?
> HGETALL user:100
1) "name"
2) "Ivan"
3) "age"
4) "25"
5) "email"
6) "ivan@cs50.net"
Приклад 3: Черга задач (List)
Уявимо, що ми — принтер. Нам надходять документи.
> LPUSH printer_queue "doc1.pdf"
(integer) 1
> LPUSH printer_queue "doc2.pdf"
(integer) 2
Зараз у списку: doc2.pdf, doc1.pdf.
Принтер бере задачу з правого кінця (перший зайшов — перший вийшов):
> RPOP printer_queue
"doc1.pdf"
Що залишилось? Тільки doc2.pdf. Це ідеальна черга!
4. 🛠 Практична частина
Тепер ваша черга. Відкрийте термінал або уявіть, що ви консоль.
Завдання 1: Hello Redis
Створіть ключ course зі значенням Redis Master. Перевірте, чи він зберігся.
Завдання 2: "Згораюче повідомлення" (TTL)
Це одна з найсильніших сторін Redis.
1. Запишіть ключ secret_code зі значенням 1234.
2. Встановіть йому час життя 10 секунд (команда EXPIRE).
3. Перевірте значення одразу, а потім через 10 секунд. Що сталося?
Завдання 3: Соціальна мережа (Sets)
Ви створюєте систему лайків. Користувач не може лайкнути пост двічі.
1. Використайте тип Set (команда SADD), щоб додати user_id (наприклад, 5, 10, 5) до ключа post:1:likes.
2. Скільки лайків у пості? (Команда SCARD).
3. Чому результат саме такий, хоча ми додавали user_id = 5 двічі?
Завдання 4: Кошик інтернет-магазину (Hash)
Створіть кошик для користувача user:42.
1. Він додав "iPhone" (1 шт) і "Case" (2 шт).
2. Потім він передумав і змінив кількість "Case" на 5.
3. Яка команда дозволить змінити конкретне поле, не чіпаючи "iPhone"?
Завдання 5: Міні-кейс
Вам потрібно зберігати історію останніх 5 відвіданих сторінок користувачем.
* Який тип даних ви оберете?
* Як зробити так, щоб список не ріс нескінченно, а зберігав тільки 5 останніх? (Підказка: погугліть LTRIM).
5. 💡 Мислення як у розробника
Ви початківці часто робите одну й ту ж помилку: називаєте ключі як попало.
* Погано: data, key1, ivan
* Добре: user:100:profile, video:55:views, session:xf312a
Як думає профі:
1. Неймінг — це навігація. Використовуйте двокрапку : як роздільник папок. Це стандарт.
2. Не використовуйте KEYS * у продакшні! Ця команда змушує Redis перебрати всі ключі. Якщо у вас їх мільйон, ваш сервер "зависне" на кілька секунд. А для Redis секунда — це вічність. Використовуйте SCAN.
3. Вибір типу — це вибір алгоритму. Якщо вам треба часто перевіряти "чи є цей юзер у списку?", не використовуйте List (це повільно, O(N)). Використовуйте Set (це миттєво, O(1)).
6. 🧩 Підсумок
Отже, що ми маємо? Redis — це не просто "кеш". Це структурний комбайн.
- Ми навчилися створювати ключі.
- Ми зрозуміли, що String — для лічильників, Hash — для об'єктів, List — для черг, а Set — для унікальності.
- Ми зрозуміли, що ключі повинні мати зрозумілу структуру.
Ви тепер вмієте не просто "зберігати дані", а обирати для них ідеальну форму.
🤔 Тизер наступного уроку: Ви запитаєте: "Девіде, все це круто, але це все живе в оперативній пам'яті. Що буде, якщо хтось висмикне шнур із розетки? Все зникне?" Гарне питання! На наступному уроці ми поговоримо про Persistence (Збереження даних) — як зробити так, щоб Redis не забував усе при перезавантаженні.
А поки що — це був CS50. Практикуйтесь!