Простое приложение, демонстрирующее один из вариантов работы с БД redis (в качестве кэша) + Postgres в CentOS 7 на примере приложения для работы с заметками (создание, чтение, редактирование, удаление)
Добавлена БД Postgres и проведена ее инициализация. В файл credentials следует добавить переменные: pgPort, pgUser, pgPass, pgDB, смысл которых ясен из названия. Используя каждый маршрут используется в первую очередь redis. В случае отсутствия данных проводится проверка в Postgresql
Redis - сетевое журналируемое хранилище данных типа «ключ — значение» с открытым исходным кодом. Нереляционная высокопроизводительная СУБД.
Postgres - свободная объектно-реляционная система управления базами данных (СУБД)
- Устанавливаем epel repo, хранилище пакетов, созданное группой специалистов операционной системы Fedora:
# yum -y install epel-release
- Затем:
# sudo yum -y update
- Непосредственно установка redis, установка автозагрузки и запуск
# sudo yum install redis -y
# sudo systemctl enable redis
# sudo systemctl start redis
- Протестируем, установлена ли БД:
# redis-cli ping
В ответе должно быть:
PONG
-
Открываем файл /etc/redis.conf с помощью любого текстового редактора
-
Чтобы redis принимала запросы с любого адреса комментируем строку
bind 127.0.0.1
Но в этом случае, для соблюдения правил безопасности, следует установить мастер-пароль:
- Мастер-пароль задается в строке:
requirepass
Например:
requirepass mySuperStrongRedisDatabasePass
- Установим пакеты
yum install postgresql postgresql-server
- Инициализиуем
/usr/bin/postgresql-setup initdb
- Запустим и добавим в автозагрузку
systemctl enable postgresql
systemctl start postgresql
- Принимаем запросы с всех адресов
Открываем postgresql.conf:
vim /var/lib/pgsql/data/postgresql.conf
Раскомментируем и редактируем строку
На
listen_addresses = '*'
Открываем pg_hba.conf:
vim /var/lib/pgsql/9.4/data/pg_hba.conf
И добавляем строку:
host all all <YOUR IP ADDRESS>/<YOUR SUBNET MASK> md5
Чтобы с указанного адреса, с указанной маской была возможность подключаться к БД
- Создание пользователя Postgresql
По умолчанию, доступен суперпользователь БД postgres. Создадим пользователя с меньшими правами, дадим ему БД и права на нее. Для этого сначала переключимся на суперпользователя БД и вызовем процедуру создания пользователя:
su postgres
createuser --interactive
После чего мы отвечаем на ряд несложных вопросов о возможностях нашего пользователя. Затем:
psql
ALTER ROLE <YOUR USER> WITH ENCRYPTED PASSWORD <YOUR USER PASSWORD>;
CREATE DATABASE <YOUR DATABASE> WITH OWNER <YOUR USER>;
GRANT ALL ON DATABASE <YOUR DATABASE> TO <YOUR USER>;
\q
После чего остается закончить вернуться к нашему изначальному пользователю и перезагрузить БД:
systemctl restart postgresql
- Скачаем файлы приложения:
# git clone https://github.com/IljaYuhtenko/nodejsredisexample
- Установим зависимости:
# npm i
- Настроим подключение к БД
Создать в директории ./config файл credentials.js в котором экспортировать переменные port, host и redisPass, например:
module.exports = {
port: 6379,
host: 'localhost',
redisPass: 'mySuperStrongRedisDatabasePassword'
}
В корневой директории запустить
# node app.js
- GET /
Выводит все имеющиеся заметки
- GET /:id
Выводит заданную заметку
- POST /
Параметры запроса:
{
"title":"NoteTitle",
"body":"NoteBody"
}
Создает заметку с указанными параметрами
- PUT /:id
Параметры запроса:
{
"title":"NoteTitle",
"body":"NoteBody"
}
Заменяет в заметке id данные на указанные в запросе
- DELETE /:id
Удаляет указанную заметку
-
Можно не устанавливать пароль, если не комментировать строку bind, а задать там тот адрес, с которого будет осуществляться подключение к БД. По умолчанию - с той же машины.
-
Если задавать пароль, то надо задавать очень сильный пароль. Так как redis лежит в оперативной памяти и быстро обрабатывает запросы, то в секунду злоумышленник можеть перепробовать до 150к паролей. А еще лучше сменить порт и поставить сильный пароль
-
Оказывается forEach ломает асинхронность. Поэтому все циклы - x of y
-
Для того, чтобы запросы к redis возвращали promise используется модуль bluebird, который к каждому виду запросов к БД добавляет Async. Например, hget => hgetAsync, hset => hsetAsync и т.д.
-
В данном приложении в качестве типа хранения данных redis использовалась структура хэш. Она требует уникального ключа, поля и значения поля. Встроееного механизма получения уникального ключа мне найти не удалось, поэтому была объявлена глобальная переменная redisID, которая при каждом добавлении записи просто инкрементируется
-
При использовании хэшей я делил приходящий json на отдельные поля, которые хранились в хэшах с разными полями, но одинаковым ключом. В качестве альтернативы можно использовать тип данных строка, где значением строки будет неразделенный json, а уникальный ключ можно получать аналогичным способом
-
С postgresql возникает чувсто большей возни в плане настроек ее взаимодействия через Интернет. Менее приятен голый синтаксис sql, вкупе с необходимостью обертки практически всех объектов в двойные кавычки, вроде названия таблицы или схемы или отдельного поля (хотя последнее решается параметризованными запросами, которые я и использую)