Redis to szybka baza danych przechowująca dane w pamięci operacyjnej w postaci par klucz-wartość i gotowych struktur (napisy, listy, zbiory, hashe, rankingi). Najczęściej służy jako cache przyspieszający aplikację, a także do sesji użytkowników, liczników i prostych kolejek. Dane można zapisywać na dysk, ale Redis nie zastępuje zwykłej bazy danych.
Redis pojawia się w prawie każdym opisie backendu: w ogłoszeniach, w dokumentacji frameworków i na rozmowach rekrutacyjnych. Wiele osób uczących się programowania słyszy o nim jako o „cache”, ale nie wie, czym dokładnie jest i kiedy go użyć. Ten artykuł wyjaśnia, czym jest Redis, jakie ma struktury danych, jak działa jako cache, co się dzieje z danymi po restarcie i jakie błędy popełniają początkujący. Zaznaczam od razu: przykłady w Pythonie uruchomiłem na bibliotece fakeredis, a nie na prawdziwym serwerze Redis. Opisy trwałości i wygaszania danych opieram na oficjalnej dokumentacji.
Czym jest Redis?
Nazwa Redis oznacza „Remote Dictionary Server”, czyli zdalny serwer słownika. To oprogramowanie, które przechowuje dane w pamięci operacyjnej (in-memory) i udostępnia je aplikacjom przez sieć. Dane są zapisane jako pary klucz-wartość (key-value): każdy element ma unikalny klucz, np. sesja:abc123, i przypisaną wartość. Dokumentacja zwraca uwagę, że możesz używać po stronie serwera tych samych typów danych, które znasz z własnego języka programowania: napisów, słowników czy list.
Skąd szybkość? Dane leżą w pamięci RAM, a nie na dysku, więc odczyt nie wymaga sięgania do wolniejszego nośnika. Tak działa większość typowych zastosowań Redisa: aplikacja zamiast pytać za każdym razem bazę danych, pyta Redisa.
Aktualna wersja Redisa to 8.10.3 (wydana 26 października 2026). Warto wiedzieć o jednej sprawie licencyjnej: w marcu 2024 roku Redis zmienił licencję z BSD na dwie licencje źródłowo dostępne, co skłoniło Linux Foundation do stworzenia otwartego forka o nazwie Valkey. Od maja 2025 roku Redis 8 oferuje też licencję AGPLv3 jako trzecią opcję. Te szczegóły pochodzą z doniesień prasowych, a nie z oficjalnego komunikatu, więc jeśli licencja ma znaczenie w Twoim projekcie, sprawdź ją u źródła. Dla nauki podstaw nie ma to znaczenia, bo komendy są w praktyce te same.
Jakie struktury danych ma Redis?
Redis nie przechowuje tylko napisów. Daje kilka gotowych struktur, a każda ma własne komendy:
| Struktura | Do czego służy | Przykład użycia |
|---|---|---|
| String (napis) | tekst, liczba, zserializowany obiekt | sesja, licznik odwiedzin, cache strony |
| Hash | obiekt z polami, jak słownik | profil użytkownika |
| List (lista) | uporządkowana sekwencja | prosta kolejka zadań |
| Set (zbiór) | unikalne elementy bez kolejności | tagi, zbiór obserwujących |
| Sorted set (zbiór posortowany) | unikalne elementy z punktacją | ranking graczy |
Najważniejsza uwaga o napisach: według dokumentacji stringi w Redisie to sekwencje bajtów, w tym tekst, zserializowane obiekty i wartości liczników. Dlatego liczby, które zapisujesz i odczytujesz, wracają do Pythona jako napisy (to widać w przykładzie niżej).
Jak wygląda kod w Pythonie? Sprawdzone przykłady
Do pracy z Redisem w Pythonie służy biblioteka redis (redis-py 8.1). Poniższe przykłady uruchomiłem na fakeredis 2.40, czyli na implementacji naśladującej Redisa w samym Pythonie, bez prawdziwego serwera. W kodzie produkcyjnym zamiast FakeRedis używasz redis.Redis(host="localhost", port=6379, decode_responses=True):
import fakeredis
r = fakeredis.FakeRedis(decode_responses=True)
# sesja z czasem życia 30 sekund
r.set("sesja:abc123", "uzytkownik:42", ex=30)
print(r.get("sesja:abc123"))
# licznik
for _ in range(3):
r.incr("odwiedziny:strona-glowna")
print(r.get("odwiedziny:strona-glowna"))
# hash jako obiekt
r.hset("uzytkownik:42", mapping={"imie": "Anna", "miasto": "Gdansk", "punkty": 120})
print(r.hgetall("uzytkownik:42"))
# ranking
r.zadd("ranking", {"anna": 120, "bartek": 95, "celina": 150})
print(r.zrevrange("ranking", 0, 1, withscores=True))
Wyniki, które zobaczyłem:
| Polecenie | Wynik | Co z tego wynika |
|---|---|---|
get klucza z TTL | uzytkownik:42 | klucz istnieje, ma jeszcze czas życia |
get nieistniejącego klucza | None | brak klucza to nie błąd, tylko None |
incr trzy razy, potem get | "3" | licznik rośnie atomowo, ale odczyt to napis |
hgetall | {'imie': 'Anna', 'miasto': 'Gdansk', 'punkty': '120'} | liczba 120 wróciła jako '120' |
sadd z duplikatem, potem scard | 2 | zbiór pomija powtórzone elementy |
zrevrange rankingu | celina 150.0, anna 120.0 | ranking zwraca elementy od najwyższej punktacji |
rpush dwóch zadań, lpop | pierwsze dodane zadanie | lista działa jak kolejka FIFO |
set z nx=True dwa razy | True, potem None | drugi zapis nie nadpisał klucza |
Ostatni wiersz to podstawa prostej blokady (lock): kilka procesów próbuje ustawić ten sam klucz, ale udaje się tylko jednemu. Do poważnych zastosowań blokady rozproszone wymagają więcej uwagi, czego tu nie sprawdzałem.
Jak działa Redis jako cache?
To najczęstsze zastosowanie. Cache (pamięć podręczna) przechowuje wynik kosztownej operacji, np. zapytania do bazy danych, żeby następnym razem go nie liczyć. Najprostszy wzorzec to cache-aside:
- Aplikacja sprawdza w Redisie, czy ma gotowy wynik.
- Jeśli tak, zwraca go od razu.
- Jeśli nie, pyta bazę danych, zapisuje wynik w Redisie z czasem życia (TTL) i zwraca go.
import json
def pobierz_uzytkownika(uid):
klucz = f"cache:uzytkownik:{uid}"
w_cache = r.get(klucz)
if w_cache is not None:
return json.loads(w_cache)
dane = pobierz_z_bazy(uid)
r.set(klucz, json.dumps(dane), ex=60)
return dane
Sprawdziłem ten wzorzec z licznikiem zapytań do „bazy”: pięć odczytów tego samego użytkownika dało jedno zapytanie do bazy, a po usunięciu klucza z cache kolejny odczyt znowu poszedł do bazy (razem dwa zapytania). Z tego wynika najważniejsza lekcja o cache: dane w cache mogą być nieaktualne. Jeśli ktoś zmieni użytkownika w bazie, a w Redisie zostanie stara kopia, aplikacja będzie ją zwracać aż do końca TTL albo do ręcznego usunięcia klucza. Dlatego każdy wpis w cache powinien mieć czas życia (parametr ex), a przy zmianie danych warto usuwać odpowiedni klucz.
Co się dzieje, gdy Redisowi zabraknie pamięci?
Dane w Redisie siedzą w pamięci RAM, a RAM jest skończona. Dokumentacja podaje dwie ważne informacje:
- Domyślnie nie ma limitu. Opcja
maxmemoryma wartość zero, co na systemach 64-bitowych oznacza brak limitu pamięci dla danych. Na serwerze z innymi usługami warto ustawić limit samemu. - Po osiągnięciu limitu działa wybrana polityka wygaszania (eviction policy). Polityka
noevictionnie usuwa niczego i zwraca błąd przy próbie dodania nowych danych (odczyty nadal działają). Dla cache dokumentacja poleca na ogółallkeys-lru, czyli usuwanie kluczy, których dawno nie używano, i nazywa ją dobrym wyborem domyślnym, jeśli nie masz powodu, by wybrać inną.
Czy cache działa dobrze, sprawdzisz poleceniem INFO stats. Pokazuje ono liczbę trafień (keyspace_hits) i chybień (keyspace_misses), z których liczysz odsetek trafień: hits / (hits + misses) * 100. Jeśli jest niższy, niż się spodziewasz, możliwe, że klucze są usuwane za szybko albo TTL jest za krótki.
Czy dane w Redisie przepadają po restarcie?
Mogą, ale nie muszą. Redis może zapisywać dane na dysk na dwa sposoby, a dokumentacja opisuje cztery konfiguracje:
| Tryb | Jak działa | Ile możesz stracić |
|---|---|---|
| RDB (migawki) | co jakiś czas zapisuje cały stan do pliku dump.rdb | zwykle ostatnie minuty |
| AOF (dziennik) | zapisuje każdą operację zapisu i odtwarza je po starcie | domyślnie do sekundy (appendfsync everysec) |
| RDB + AOF | oba naraz | najmniej, to zalecenie dla ważnych danych |
| Brak trwałości | wszystko tylko w pamięci | wszystko po restarcie |
Dokumentacja radzi: jeśli zależy Ci na bezpieczeństwie danych na poziomie zbliżonym do PostgreSQL, używaj obu metod naraz. Jeśli możesz zaakceptować utratę kilku minut danych, wystarczy sam RDB. Brak trwałości bywa świadomym wyborem przy czystym cache, bo tracisz tylko kopie, które da się odtworzyć z bazy. Dlatego Redis jako główne miejsce przechowywania ważnych danych (zamówień, płatności) wymaga dużej ostrożności: do tego służy zwykła baza danych, np. relacyjna, o której piszemy w artykule o relacjach i JOIN-ach w SQL.
Redis czy baza danych? Redis czy Kafka?
To dwa najczęstsze pytania początkujących:
| Pytanie | Krótka odpowiedź |
|---|---|
| Redis zamiast bazy danych? | Zwykle nie. Redis jest szybki, ale trzyma dane w pamięci i nie ma relacji ani zapytań jak SQL. Najczęściej stoi obok bazy i przyspiesza odczyty. |
| Redis zamiast Kafki? | To inne narzędzia: Redis to szybki magazyn w pamięci, a Kafka to trwały dziennik zdarzeń, który wiele usług czyta niezależnie. Redis wystarczy do prostej kolejki zadań (lista), do rozbudowanych strumieni zdarzeń służy Kafka. Opisujemy ją w artykule czym jest Apache Kafka. |
Do czego używa się Redisa?
| Zastosowanie | Struktura | Dlaczego Redis |
|---|---|---|
| Cache wyników zapytań lub stron | string | szybki odczyt, automatyczne wygasanie |
| Sesje użytkowników | string lub hash | TTL sam kończy sesję |
| Liczniki (odwiedziny, limity zapytań) | string z INCR | atomowy licznik |
| Rankingi | sorted set | gotowe sortowanie po punktacji |
| Prosta kolejka zadań | lista | RPUSH i LPOP |
| Blokada (np. tylko jeden worker naraz) | string z NX | zapis tylko, gdy klucz nie istnieje |
Jeśli interesuje Cię temat sesji i logowania, zobacz JWT i logowanie w FastAPI. Tokeny JWT i sesje trzymane w Redisie to dwa różne podejścia do tego samego problemu.
Jakie błędy najczęściej popełniają początkujący?
| Błąd | Co się dzieje | Jak uniknąć |
|---|---|---|
| Operacja na kluczu złego typu | błąd WRONGTYPE Operation against a key holding the wrong kind of value (sprawdziłem: LPUSH na kluczu, który był stringiem) | trzymaj typ pod kluczem i nadawaj klucze z prefiksem, np. sesja:, cache: |
| Brak TTL w cache | stare dane zostają na zawsze, pamięć rośnie | zawsze ustawiaj ex dla wpisów cache |
| Przeglądanie wszystkich kluczy | na dużej bazie blokuje serwer (popularne pytanie „jak wypisać wszystkie klucze”) | używaj SCAN z kursorem, jak w dokumentacji |
| Liczby jako napisy | "120" zamiast 120 | konwertuj po odczycie (int(...)) |
| Brak limitu pamięci | Redis zjada całą pamięć serwera | ustaw maxmemory i politykę wygaszania |
| Cache jako jedyne miejsce danych | po restarcie bez trwałości dane znikają | ważne dane trzymaj w zwykłej bazie |
Kto używa Redisa i z jakimi technologiami się go łączy?
Najlepszym dostępnym wskaźnikiem popularności jest ankieta Stack Overflow Developer Survey 2025. W kategorii baz danych Redis zajął 5. miejsce: używało go 28% wszystkich respondentów i 30,7% programistów zawodowych, a wyprzedziły go tylko PostgreSQL, MySQL, SQLite i Microsoft SQL Server. Ankieta wspomina też o wyraźnym wzroście użycia Redisa (o 8 punktów procentowych), ale w dostępnym tekście strony nie podano, względem którego roku. To dobrowolna ankieta programistów, a nie pomiar rynku.
Strona Redisa z historiami klientów pokazuje, do czego firmy go używają (to materiał marketingowy producenta, a podane liczby pochodzą od Redisa i klientów, bez niezależnej weryfikacji):
| Firma | Zastosowanie (wg strony Redisa) |
|---|---|
| Axis Bank | przyspieszenie płatności online i transakcji UPI (deklarowane 76% szybciej) |
| Sony LIV | szybsze odpowiedzi API (deklarowane 37%) i mniejsze zużycie pamięci |
| Plivo | obsługa ponad miliarda zapytań do API miesięcznie |
| Ulta Beauty | szybkie działanie internetowego sklepu |
| Raymond James, CP AXTRA, Superlinked | wyszukiwanie wektorowe i hybrydowe, m.in. dla rekomendacji i systemów RAG |
Z jakimi technologiami łączy się Redisa? Dokumentacja opisuje go jako narzędzie, którego „zwykle używa się jako cache do przyspieszania odczytów z wolniejszego serwera lub bazy danych”, więc najczęściej stoi obok głównej bazy (np. PostgreSQL czy MySQL, które w ankiecie Stack Overflow są wyżej). Dokumentacja pokazuje klientów dla wielu języków: Python (redis-py), JavaScript (Node.js), Java (Jedis, Lettuce), Go, C#, PHP (Predis), Ruby i Rust, więc pasuje do niemal każdego backendu. Od niedawna Redis pojawia się też w projektach AI, np. do wyszukiwania wektorowego i pamięci agentów. Nie sprawdzałem, które frameworki mają wbudowaną obsługę Redisa jako cache ani jak często robią to polskie firmy.
Czy Redis pojawia się w ofertach pracy?
Sprawdziłem to 5 listopada 2026 na portalu justjoin.it, wpisując słowo kluczowe w wyszukiwarkę: z 20 393 wszystkich ofert fraza „redis” dała 489 wyników (około 2,4%). Czytaj to ostrożnie: nie wiem, jak portal dopasowuje słowo kluczowe (w tytule, tagach czy opisie), a jeden pomiar z jednego dnia nie mówi nic o trendzie. Nie nadaje się do porównań z innymi technologiami. Sama liczba mówi tylko, że Redis jest w ofertach obecny. Pierwsze wyniki to zwykłe stanowiska (programista AI w Pythonie, DevOps, programista PHP), na których Redis jest jedną z technologii, a nie nazwą stanowiska.
Jak zacząć naukę Redisa?
- Opanuj backend. Redis ma sens, gdy masz aplikację i bazę danych, które chcesz przyspieszyć. Zacznij od pierwszego API we FastAPI.
- Zainstaluj Redisa lokalnie według instrukcji w dokumentacji albo załóż darmową bazę w chmurze Redis Cloud, do której dokumentacja odsyła na początek.
- Poznaj
redis-clii pięć podstawowych struktur:SET/GET,HSET,RPUSH,SADD,ZADD. - Dodaj cache do własnej aplikacji wzorcem cache-aside i zmierz, ile zapytań do bazy zaoszczędziłeś.
- Ustaw TTL,
maxmemoryi politykę wygaszania i sprawdź hit ratio wINFO stats.
Jeśli chcesz zbudować solidny fundament backendowy w Pythonie pod okiem mentora, zapraszam na kurs Python developer. Redis nie jest jego elementem, ale to, czego nauczysz się o API, bazach danych i architekturze aplikacji, jest punktem wyjścia do cache'owania i optymalizacji.
Na co zwraca uwagę mentor przy Redisie?
Zanim dodasz Redisa, sprawdź, czy wolne zapytanie nie potrzebuje po prostu indeksu w bazie. Cache ukrywa problem, a nie go usuwa.
Podsumowanie
- Redis to szybki magazyn klucz-wartość w pamięci z gotowymi strukturami: napis, hash, lista, zbiór i zbiór posortowany.
- Najczęściej służy jako cache (wzorzec cache-aside z TTL), do sesji, liczników, rankingów i prostych kolejek.
- Dane w cache bywają nieaktualne, więc każdy wpis powinien mieć czas życia, a przy zmianie danych warto usuwać klucz.
- Domyślnie Redis nie ma limitu pamięci; po jego ustawieniu polityka
allkeys-lrujest według dokumentacji dobrym wyborem dla cache. - Dane można zapisywać na dysk (RDB, AOF lub oba), ale Redis zwykle stoi obok zwykłej bazy danych, a nie zamiast niej.
- Przykłady w Pythonie sprawdziłem na
fakeredis, bez prawdziwego serwera Redis.


