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://stackshare.io/redis

https://aws.amazon.com/elasticache/redis-vs-memcached/

Oceń artykuł na temat: Redis w PHP – tutorial i instalacja
Średnia : 4.7 , Maksymalnie : 5 , Głosów : 19