Redis

Abban az esetben, ha szükségünk van cache-elésre, mert sok statikus adattal dolgozunk és nagy mennyiségű felhasználó szeretné a szoftverünket használni, akkor használhatunk redis-t. A redis egy szerver oldali alkalmazás, ami a memórában tárolja az adatokat key-value párokban.

Redis telepítése:
# apt-get update
# apt-get install redis-server
# service redis-server status

Ellenőrizzük, hogy fut-e:
# ps aux | grep redis

Consolos felület:
# redis-cli

Monitorozhatjuk a lefutott parancsokat:
> monitor

Kulcs létrehozás:
> set x "teszt"

Kulcs lekérdezése:
> get x

Kulcs törlése:
> del x

Kulcs ellenőrzése, hogy létezik-e:
> keys *valami

Adatbázis választás:
> select 3

Törli a kulcsokat az akutális db-ből:
> flushdb

Összes kulcsot törli
> flushall

Symfony-ban egy gyors példa következik.

Composer csomag:
# composer require predis/predis

Állítsuk be a configot, config/packages/cache.yaml:
framework:
    cache:
        # Redis
        app: cache.adapter.redis
        default_redis_provider: 'redis://%env(REDIS_HOST)%/%env(REDIS_DB)%'

.env:
###> REDIS ###
REDIS_ENABLED=true
REDIS_HOST='localhost:6379'
REDIS_DB="0"
###< REDIS ###

Készítünk egy redis service-t:
<?php

namespace App\Service;

use Predis;

class RedisService
{
    private $redis;

    public function __construct()
    {
        $sentinels = [$_ENV['REDIS_HOST']];

        $options = [
            'service' => 'mymaster',
            'parameters' => [
                'database' => $_ENV['REDIS_DB']
            ]
        ];

        $this->redis = new Predis\Client($sentinels, $options);
    }

    public function getData(string $cacheKey): string
    {
        return $this->redis->get($cacheKey) ?? '';
    }

    public function setData(string $cacheKey, array $data, int $ttl = 60, string $expireResolution = 'ex'): bool
    {
        $result = $this->redis->set($cacheKey, serialize($data), $expireResolution, $ttl);

        return (boolean)($result->getPayload() == "OK");
    }

    public function incr(string $command): string
    {
        return $this->redis->incr($command);
    }
}

Példa használatra:
$predis = new RedisService();

// datok lekérdezése
$predis->getData($key);

// elmentünk adatokat, amit 60 másodpercig fog tárolni
$predis->setData($key, $redisData, 60);

// ha közvetlenül szeretnénk parancsot kiadni
$predis->incr('get test.data');


Ha kell a linux szerveren állítsunk az /etc/redis/redis.conf-ban bind-et, hogy kívülről elérjük.


Olvasnivaló:
https://packagist.org/packages/predis/predis
https://hackerbox.io/articles/symfony-4-redis-cache/
http://www.inanzzz.com/index.php/post/3th5/install-and-use-redis-in-symfony-applications
https://redislabs.com/blog/get-sql-like-experience-redis/
2021.04.17.