Redis trzyma dane w pamięci i odpowiada w około milisekundę, dlatego stoi za tyloma aplikacjami jako cache, kolejka albo magazyn sesji. Instalacja to jedno polecenie. Praca zaczyna się przy ustawieniach domyślnych: brak limitu pamięci, migawki, które mogą zgubić ostatnie zapisy, i dwa łatwe błędy, które po cichu kasują dane albo wyłączają hasło. Ten poradnik omawia to wszystko na Ubuntu 24.04. Każdy krok przeszliśmy na naszym obrazie, a liczby pochodzą z serwera Micro (2 vCPU, 2 GB).
Potrzebujesz użytkownika z sudo. Tworzy go poradnik konfiguracji Ubuntu.
1. Instalacja
sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping
Instalacja trwała 13 sekund i dała Redis 7.0.15. Uruchamia się od razu i przy każdym starcie, odpowiada PONG i nasłuchuje tylko na samym serwerze: 127.0.0.1:6379 i [::1]:6379, z protected-mode yes. Bez danych zajmował 13,5 MB RAM.
W logu było już ostrzeżenie:
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.
Redis zapisuje na dysk z kopii samego siebie utworzonej przez fork, a przy domyślnym ustawieniu jądra ten fork może się nie udać, gdy brakuje pamięci. Popraw to raz:
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/90-redis.conf
sudo sysctl -p /etc/sysctl.d/90-redis.conf
sudo systemctl restart redis-server
Po restarcie ostrzeżenie zniknęło.
2. Ogranicz pamięć
Fabrycznie maxmemory wynosi 0, czyli brak limitu, a polityka to noeviction. Redis będzie zajmował RAM, aż na serwerze go zabraknie. Ustaw sufit i zdecyduj, co się dzieje, gdy zostanie osiągnięty:
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE
Sprawdziliśmy obie polityki z limitem 64 MB i 400 000 zapisów:
noeviction(domyślna): pamięć zatrzymała się na 63 MB, a nowe zapisy kończyły się błędemOOM command not allowed when used memory > 'maxmemory'. Dobra dla kolejki i wszystkiego, czego nie możesz stracić.allkeys-lru: Redis usunął najdawniej używane klucze, 48 606 sztuk, a wszystkie zapisy przeszły. Dobra dla cache.
CONFIG REWRITE zapisuje bieżące ustawienia w /etc/redis/redis.conf, więc przetrwają restart. Dodaje też linię, o której trzeba wiedzieć przed krokiem 4.
3. Wybierz sposób zapisu na dysk
Domyślnie Redis zapisuje migawkę (/var/lib/redis/dump.rdb) po 1 zmianie w ciągu godziny, 100 w ciągu pięciu minut lub 10 000 w ciągu minuty. Sprawdziliśmy trzy sposoby jego zatrzymania:
| Jak zatrzymał się Redis | Tylko migawki (domyślnie) | Z plikiem AOF |
|---|---|---|
systemctl restart | Nic nie zginęło: zapisuje przy zamykaniu | Nic nie zginęło |
Zabity przez kill -9 | Klucz zapisany po ostatniej migawce zniknął | Klucz zapisany 2 sekundy przed kill był na miejscu |
W obu przypadkach systemd sam podniósł Redisa w kilka sekund.
Jeśli w Redisie są dane, których byłoby szkoda, włącz plik AOF (append-only file). Zapisuje on każdą operację i zrzuca ją na dysk raz na sekundę. Rób to na działającym serwerze, a nie przez edycję pliku:
redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_
Najpierw spróbowaliśmy innej drogi i kosztowało nas to dane. Zmieniliśmy appendonly no na appendonly yes w redis.conf i zrestartowaliśmy. Redis wstał z pustym AOF i nic nie wczytał z migawki, więc wszystkie dotychczasowe klucze zniknęły. Przy następnym zamknięciu zapisał swoją nową zawartość, już bez starych kluczy, jeszcze na dump.rdb. CONFIG SET tego unika: Redis najpierw zapisuje AOF z danych w pamięci. Po restarcie wszystkie nasze klucze były na miejscu.
Jeśli Redis to czysty cache, który może startować pusty, zrób odwrotnie i wyłącz zapisywanie: redis-cli CONFIG SET save "".
4. Ustaw hasło
Oto druga pułapka. Po każdym CONFIG REWRITE Redis 7 dopisuje na końcu redis.conf taką linię:
user default on nopass ~* &* +@all
Oznacza ona „domyślny użytkownik nie potrzebuje hasła”. Potem dodaliśmy requirepass wyżej w pliku i zrestartowaliśmy. Redis dalej odpowiadał PONG bez hasła, bo linia user ma pierwszeństwo. Ustaw hasło przez sam Redis:
REDIS_PASS=$(openssl rand -hex 24)
echo "$REDIS_PASS"
redis-cli CONFIG SET requirepass "$REDIS_PASS"
REDISCLI_AUTH="$REDIS_PASS" redis-cli CONFIG REWRITE
Zapisz hasło w bezpiecznym miejscu. Teraz Redis przechowuje je jako skrót SHA-256 w tej samej linii user default. Po restarcie redis-cli ping odpowiedział NOAUTH Authentication required. i działało tylko hasło. Przekazuj je do redis-cli przez zmienną REDISCLI_AUTH. Z opcją -a widać je na liście procesów i redis-cli przed tym ostrzega. W aplikacji wpisz je w adres Redisa: redis://:PASSWORD@127.0.0.1:6379/0.
5. Połączenie ze swojego komputera
Zostaw Redisa na 127.0.0.1 i korzystaj z tunelu SSH. Podaj port SSH swojego serwera; na planach z NAT to Twój osobisty port:
ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22
Dopóki tunel działa, redis-cli -p 6380 i programy na Twoim komputerze rozmawiają z Redisem na serwerze. Do internetu nic nowego nie zostaje otwarte. Z poradnikiem o kluczach SSH tunel loguje się bez hasła.
Jak jest szybki
Na serwerze testowym Micro redis-benchmark z 50 klientami pokazał:
| Test | Żądań na sekundę | Mediana opóźnienia |
|---|---|---|
| SET | 30 303 | 1,0 ms |
| GET | 35 149 | 0,9 ms |
| SET, 16 poleceń na jedną wymianę | 272 109 | 2,4 ms |
| GET, 16 poleceń na jedną wymianę | 414 938 | 1,3 ms |
Na cache albo kolejkę zadań aplikacji webowej to dużo więcej, niż będzie potrzebne. Dodatkowa szybkość bierze się z wysyłania poleceń paczkami (pipelining).
Jaki plan
Redis potrzebuje RAM na Twoje dane i niewiele więcej. Nano (2 vCPU, 1 GB, $3/mies.) uciągnie Redisa obok małej aplikacji przy maxmemory 256mb. Micro (2 GB, $5/mies.) zostawia miejsce na większy cache i samą aplikację. Jeśli coś innego ma łączyć się z Redisem bezpośrednio, weź własny IPv4 (od Nano-IP za $8/mies.) i w zaporze wpuść tylko ten jeden adres. Wszystkie plany są na stronie VPS, a płatność odbywa się w USDT, USDC lub ETH w sieciach Base, Ethereum lub Polygon.
Komentarze
Brak komentarzy. Bądź pierwszy.