W tym artykule postaram się przybliżyć temat kolejnego systemu pamięci podręcznej typu In-Memory, czyli de facto bazy NOSQL, która potrafi przechowywać dane w pamięci RAM serwera. Zainstalujemy, skonfigurujemy i nauczymy się wykorzystywać Redis na przykładzie prostej aplikacji w PHP.
Co to jest Redis?
Redis to baza danych do przechowywania asocjacyjnych struktur danych (czyli typu klucz-wartość). Redis wspiera różne formaty i w przeciwieństwie do memcached, potrafi tworzyć snapshoty i przechowywać dane na trwałym nośniku (np. dysku twardym). Wspiera transakcje i replikację. Twórcą tego projektu open-source jest Salvatore Sanfilippo a obecnie projekt jest sponsorowany przez Redis Labs.
Popularne projekty wykorzystujące bazę Redis:
- Airbnb,
- Uber,
- Instagram,
- Pinterest,
- medium.com,
- Twitter,
- reddit,
- Slack,
- Instacart
…i wiele więcej.
Redis podobnie jak memcached zapewnia milisekundowy dostęp do pamięci za sprawą wykorzystywania pamięci RAM. Pozwala przyspieszać aplikacje internetowe i odciążać bazę danych co jest koniecznym krokiem w skalowaniu aplikacji webowych oraz minimalizowaniu czasu TTFB w aplikacjach webowych, które są obciążone odczytami. Redis jest łatwy w użytkowaniu, pozwala tworzyć partycje i wspiera wiele języków programowania. Różnice pomiędzy Redis a Memcached opisałem w poniższych punktach.
Zalety Redis
- wsparcie dla złożonych struktur danych,
- możliwość zapisywania danych na dysku twardym,
- umożliwia tworzyć replikacje,
- możliwość tworzenia transakcji podobnej do tej znanej z SQL,
- wsparcie Pub/Sub (np. do tworzenia usług Chat).
Wady Redis
- brak wielowątkowej architektury,
- mniejsza popularność.
Instalacja Redis
Na przykładzie systemu Debian:
sudo apt update sudo apt install redis-server
Sprawdźmy czy działa:
redis-cli
Wpisujemy teraz:
ping
Powinniśmy otrzymać odpowiedź: PONG

Wychodzimy za pomocą komendy exit i instalujemy rozszerzenie do PHP:
sudo apt-get install php-redis
Restartujemy całego Apache:
/etc/init.d/apache2 restart
Jak używać Redis w PHP?
Zróbmy taki prosty przykład ustawiania i odczytywania wartości:
$redis = new Redis(); $redis->connect("localhost",6379); $redis -> set('test', "Witaj świecie!"); echo $redis -> get("test");
Tworzymy obiekt klasy Redis, następnie następuje połączenie (port 6379 jest domyślny). Jeżeli wszystko jest OK powinniśmy otrzymać tylko napis „Witaj świecie”.
Sa pomocą metody setex możemy ustawić wartość ze z góry ustalonym czasem TTL:
$redis -> setex("klucz', 60, wartość");
Jeżeli odpytamy Redisa o tę wartość od razu, to otrzymamy wartość, natomiast po minucie, wartość wygaśnie.
Proste sprawdzenie możemy zrobić w konstrukcji if:
if ($redis ->get("test")){ echo "Wartość istnieje"; }else{ echo "Wartość nie istnieje"; }
Lub za pomocą specjalnej metody exists:
if ($redis ->exists("test")){ echo "Wartość istnieje"; }else{ echo "Wartość nie istnieje"; }
Możemy usuwać wartości za pomocą metody del:
$redis -> del("test");
Przydatne instrukcje Redis
W Redis możemy też łatwo inkrementować i dekrementować przechowywanie wartości:
$redis->set("licznik", 0); $redis->incr("licznik"); // doda 1 $redis->decr("licznik"); // odejmie 1 $redis->incrby("licznik", 15); // doda 15 $redis->decrby("licznik", 10); // odejmie 10
Wykorzystanie Redis w proceduralnym PHP z MySQL
$key = "user32"; $result= $redis->get($key); if (!$result){ require_once("dbconnect.php"); $sql = "SELECT * FROM users WHERE user_id = 32"; $query = mysqli_query($dbconn, $sql); $result = mysqli_fetch_assoc($query); $ redis -> set($key, $result) or die("Nie można stworzyć..."); } var_dump($result);
Przykład wykorzystania Redis z biblioteką PDO
$key = "user32"; $result = $redis->get($key); if (!$result) { require_once("dbconnect.php"); $sql = "SELECT * FROM users WHERE user_id = :id"; $dbo->prepare($sql); $stmt->bindValue(':id', 32, PDO::PARAM_INT); $result = $stmt->fetch(PDO::FETCH_OBJ); $redis -> set($key, serialize($result)); } var_dump(unserialize($result));
Trwałosć danych w Redis
Redis pozwala na tworzenie snapshotów. Sprawdźmy jak to działa w praktyce. Kiedy usuniemy komendę set, która nie miała z góry ustalonego czasu wygasania, dane będą trzymane w nieskończoność (aż do wyczerpania miejsca jaki RAM jaki serwer przeznacza na Redisa).
Kiedy zrestartujemy serwer lub serwer Redis komendą:
/etc/init.d/redis-server restart
Dane nie zostaną utracone jak możemy się tego spodziewać. Redis przy każdym zapisie wykonuje też zapis danych na dysku. Aby to wyłączyć trzeba ustawić w konfiguracji appendonly no i zakomentować instrukcje save.
Podsumowanie
Pamięć podręczną Redis wykorzystamy wszędzie tam, gdzie potrzebujemy szybkiego buforowania, rankingów na żywo, czy nieco bardziej złożonych przypadków takich jak aplikacja Chat. Redis pozwoli buforować dane w złożonych strukturach danych, co odciąży inne nośniki i radykalnie zwiększy wydajność aplikacji. Dodatkową funkcją Redis jest domyślny tryb persistence, w którym dane są trwale zapisywane na dysku i możemy tworzyć w dowolnej chwili snapshoty zapisanych danych.
Źródła
https://redis.io/documentation
https://aws.amazon.com/elasticache/redis-vs-memcached/
Odpowiedz lub skomentuj