Для начала немного информации.
1. Что такое Redis?
Redis — это высокопроизводительное нереляционное распределённое хранилище данных. В отличие от Memcached, который может в любой момент удалить ваши данные, вытесняя старые записи новыми, Redis хранит информацию постоянно, таким образом он похож на MemcacheDB.
2. Чем Redis отличается от существующих решений?
API для работы с Memcached (MemcacheDB) позволяет хранить массивы, но эти массивы будут сериализованы и сохранены как строки, таким образом атомарные операции над такими массивами не возможны.
Redis позволяет хранить как строки, так и массивы, к которым можно применять атомарные операции pop/push, делать выборки из таких массивов, выполнять сортировку элементов, получать объединения и пересечения массивов.
3. Производительность
110000 запросов SET в секунду, 81000 запросов GET в секунду на Linux-сервере начального уровня (тесты).
Высокая скорость работы Redis обеспечивается тем, что данные хранятся в оперативной памяти и сохраняются на диск либо через равные промежутки времени, либо при превышении определённого количества не сохранённых запросов. Из этого вытекает, что используя Redis, вы можете потерять результаты нескольких последних запросов, что вполне приемлемо для большинства веб-приложений, учитывая, что обращение к Redis по скорости сравнимо с обращением к оперативной памяти. Тем не менее, потерь можно избежать через избыточность — Redis поддерживает неблокирующую master-slave репликацию.
4. Sharding
Redis, как и Memcached, может работать как распределённое хранилище на многих физических серверах. Такой функционал реализуется в клиентских библиотеках, и к сожалению, «из коробки» этот функционал реализован пока только в Ruby API, однако это не мешает вам хешировать ключ самостоятельно и получать ID сервера, к которому с этим ключом обращаться.
Установка и базовая настройка.
Исходные данные: Debian 8.8 Jessie (amd64)
Установка:
apt-get install redis-server
Проверяем
netstat -plunt | grep -i redis tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1035/redis-server 1
Все нормально, Redis слушает на порту 6379.
Настройка безопасности.
1. Запускаем redis-server только на localhost
В некоторых дистрибутивах Linux после установки Redis принимает запросы на всех интерфейсах, что недопустимо из соображений безопасности, т.к. по-умолчанию доступ к Redis не защищен паролем.
Поэтому будет не лишним проверить в файле /etc/redis/redis.conf
наличие строки
bind 127.0.0.1
Если её нет, обязательно пропишите.
Далее, если прописали, то перезапускаем Redis:
/etc/init.d/redis-server restart
2. Ставим пароль на доступ к redis-server:
Как я уже говорил выше, по-умолчанию к редис может подключиться любой желающий без пароля, например так:
redis-cli info | grep redis_version
Поэтому создаем пароль:
echo "MEGAPASSWD" | sha256sum
И в файле /etc/redis/redis.conf пишем
requirepass 8e77158d2c7a0348d16fb0ef59af6afbefac9dfb11a8f3a16a7a822b5feaf39e
Далее, если прописали, то перезапускаем Redis:
/etc/init.d/redis-server restart
Теперь при попытке сделать:
redis-cli info | grep redis_version
мы видим, что анонимно заходить нельзя.
А как тогда можно?
Например так:
redis-cli 127.0.0.1:6379> info NOAUTH Authentication required. 127.0.0.1:6379> AUTH 8e77158d2c7a0348d16fb0ef59af6afbefac9dfb11a8f3a16a7a822b5feaf39e OK 127.0.0.1:6379> info # Server redis_version:2.8.17 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:4c1d5710660b9479 redis_mode:standalone os:Linux 3.16.0-4-amd64 x86_64 .... 127.0.0.1:6379> quit
ВНИМАНИЕ! Запуская redis-cli и вводя в нем команды, включая AUTH с паролем история этих команд сохраняется в файле ~/.rediscli_history
Если злоумышленник получит к нему доступ, то и сможет узнать пароль.
Конечно ~/.rediscli_history доступен только текущему пользователю, например root и никто другой его не прочитает, но об этом лучше знать.
Так же пароль хранится в файле /etc/redis/redis.conf и по-умолчанию этот файл доступен на чтение всем пользователям сервера, что совершенно неправильно и это мы исправим далее.
3. Переименовываем и отключаем особо важные команды, это FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME и DEBUG
Для этого в файле /etc/redis/redis.conf пишем:
rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command DEBUG "" rename-command SHUTDOWN SHUTDOWN_SECRETCMD rename-command CONFIG CONFIG_SECRETCMD
Далее, если прописали, то перезапускаем Redis:
/etc/init.d/redis-server restart
4. Смена прав на директорию с базой и файл конфигурации
Смотрим права по-умолчанию на директорию с базой:
ls -ld /var/lib/redis drwxr-xr-x 2 redis redis 4096 Sep 9 10:14 redis
Меняем
chmod 700 /var/lib/redis
Смотрим права по-умолчанию на файл конфигурации
ls -l /etc/redis/redis.conf -rw-r--r-- 1 root root 33004 Sep 9 10:15 /etc/redis/redis.conf
Меняем
chown redis:root /etc/redis/redis.conf chmod 600 /etc/redis/redis.conf
Далее, если все сделали, то перезапускаем Redis:
/etc/init.d/redis-server restart
На этом базовая настройка Redis закончена.
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, PostgreSQL) на протяжении последних 24 лет.