Redis хранит данные в памяти и отвечает примерно за миллисекунду, поэтому он стоит за множеством приложений в роли кэша, очереди или хранилища сессий. Установка — одна команда. Работа начинается с настроек по умолчанию: лимита памяти нет, снимки могут потерять последние записи, и есть две лёгкие ошибки, которые незаметно стирают данные или отключают пароль. Эта инструкция разбирает всё это на Ubuntu 24.04. Каждый шаг мы прошли на нашем образе, цифры сняты на сервере Micro (2 vCPU, 2 ГБ).
Нужен пользователь с sudo. Его создаёт инструкция по настройке Ubuntu.
1. Установка
sudo apt update
sudo apt install -y redis-server
redis-server --version
redis-cli ping
Установка заняла 13 секунд и поставила Redis 7.0.15. Он сразу запускается, стартует при каждой загрузке, отвечает PONG и слушает только сам сервер: 127.0.0.1:6379 и [::1]:6379, с protected-mode yes. Без данных он занял 13,5 МБ памяти.
В журнале уже было предупреждение:
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition.
Redis сохраняет данные на диск из своей копии, созданной через fork, и при стандартной настройке ядра этот fork может не сработать, когда памяти мало. Исправьте один раз:
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
После перезапуска предупреждение исчезло.
2. Ограничьте память
Из коробки maxmemory равен 0, то есть лимита нет, а политика — noeviction. Redis будет занимать память, пока она на сервере не кончится. Задайте потолок и решите, что происходит при его достижении:
redis-cli CONFIG SET maxmemory 256mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
redis-cli CONFIG REWRITE
Мы проверили обе политики с лимитом 64 МБ и 400 000 записей:
noeviction(по умолчанию): память остановилась на 63 МБ, а новые записи падали с ошибкойOOM command not allowed when used memory > 'maxmemory'. Подходит для очереди и всего, что нельзя терять.allkeys-lru: Redis выбросил давно не используемые ключи, 48 606 штук, и все записи прошли. Подходит для кэша.
CONFIG REWRITE сохраняет текущие настройки в /etc/redis/redis.conf, и они переживают перезапуск. Ещё она добавляет строку, о которой нужно знать до шага 4.
3. Выберите, как сохранять на диск
По умолчанию Redis пишет снимок (/var/lib/redis/dump.rdb) после 1 изменения за час, 100 за пять минут или 10 000 за минуту. Мы проверили три способа его остановить:
| Как остановился Redis | Только снимки (по умолчанию) | С журналом AOF |
|---|---|---|
systemctl restart | Ничего не потеряно: при остановке он сохраняется | Ничего не потеряно |
Убит через kill -9 | Ключ, записанный после последнего снимка, пропал | Ключ, записанный за 2 секунды до kill, на месте |
В обоих случаях systemd сам поднял Redis за несколько секунд.
Если в Redis лежат данные, которых будет жалко, включите журнал AOF (append-only file). Он записывает каждую операцию и сбрасывает её на диск раз в секунду. Делайте это на работающем сервере, а не правкой файла:
redis-cli CONFIG SET appendonly yes
redis-cli CONFIG REWRITE
redis-cli INFO persistence | grep aof_
Сначала мы попробовали другой путь, и он стоил нам данных. Мы поменяли appendonly no на appendonly yes в redis.conf и перезапустили. Redis поднялся с пустым AOF и ничего не загрузил из снимка, так что все прежние ключи пропали. А при следующей остановке он записал своё новое содержимое, уже без старых ключей, ещё и поверх dump.rdb. CONFIG SET этого избегает: Redis сначала пишет AOF из данных в памяти. После перезапуска все наши ключи были на месте.
Если Redis — чистый кэш, которому не страшно стартовать пустым, сделайте наоборот и отключите сохранение: redis-cli CONFIG SET save "".
4. Поставьте пароль
Вот вторая ловушка. После любого CONFIG REWRITE Redis 7 добавляет в конец redis.conf такую строку:
user default on nopass ~* &* +@all
Она значит «пользователю по умолчанию пароль не нужен». Потом мы добавили requirepass выше в файле и перезапустили. Redis по-прежнему отвечал PONG без пароля, потому что строка user его перекрывает. Задавайте пароль через сам 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
Сохраните пароль в надёжном месте. Теперь Redis хранит его хешем SHA-256 в той же строке user default. После перезапуска redis-cli ping ответил NOAUTH Authentication required., и работал только пароль. Передавайте его в redis-cli через переменную REDISCLI_AUTH. С ключом -a он виден в списке процессов, и redis-cli об этом предупреждает. В приложении укажите его в адресе Redis: redis://:PASSWORD@127.0.0.1:6379/0.
5. Подключение со своего компьютера
Оставьте Redis на 127.0.0.1 и пользуйтесь SSH-туннелем. Укажите SSH-порт вашего сервера; на тарифах с NAT это ваш персональный порт:
ssh -N -L 6380:127.0.0.1:6379 deploy@YOUR_SERVER_IP -p 22
Пока туннель открыт, redis-cli -p 6380 и программы на вашем компьютере работают с Redis на сервере. В интернет при этом ничего нового не открыто. С инструкцией по SSH-ключам туннель будет входить без пароля.
Насколько он быстрый
На тестовом сервере Micro redis-benchmark с 50 клиентами показал:
| Тест | Запросов в секунду | Медианная задержка |
|---|---|---|
| SET | 30 303 | 1,0 мс |
| GET | 35 149 | 0,9 мс |
| SET, 16 команд за один обмен | 272 109 | 2,4 мс |
| GET, 16 команд за один обмен | 414 938 | 1,3 мс |
Для кэша или очереди задач веб-приложения это намного больше, чем понадобится. Дополнительная скорость берётся из отправки команд пачками (pipelining).
Какой тариф выбрать
Redis нужна память под ваши данные и почти ничего больше. Nano (2 vCPU, 1 ГБ, $3/мес) держит Redis рядом с небольшим приложением при maxmemory 256mb. Micro (2 ГБ, $5/мес) оставляет место под кэш побольше и само приложение. Если к Redis должен напрямую подключаться кто-то ещё, возьмите собственный IPv4 (с Nano-IP за $8/мес) и разрешите в файрволе только этот адрес. Все тарифы — на странице VPS, оплата в USDT, USDC или ETH в сетях Base, Ethereum или Polygon.
Комментарии
Пока нет комментариев. Будьте первым.