Является ли объявление клиента Node.js redis константой в нескольких помощниках безопасным способом его использования? - PullRequest
1 голос
/ 17 июня 2020

Это немного сложно сформулировать, поэтому я надеюсь, что мой заголовок не слишком ужасен.

У меня есть веб-приложение frontend / backend React / Node.js (REST API), в которое я хочу добавить поддержку Redis для хранения глобальных настроек приложения и настроек c для каждого пользователя (например, языковых предпочтений, последнего входа в систему и т. д. c ... простых вещей). Поэтому я рассматривал возможность добавления ветки / settings к моему внутреннему REST API, чтобы нажимать / получить эту информацию из экземпляра redis.

Вот где проявляется моя Node.js неопытность. Я смотрю на использование клиента ioredis, и это кажется слишком простым. Если у меня есть несколько помощников (более одного. js, которые будут вызывать redis), будет ли безопасно создавать клиента как const в каждом? Или есть другой рекомендуемый подход к повторному использованию одного экземпляра: go?

Вот пример того, что я собираюсь сделать. Представьте, если бы у меня было 3 вспомогательных модуля, которым требуется доступ к клиенту Redis. Должен ли я объявить их как const в каждом? Или централизовать их в одном вспомогательном модуле и получить от него клиента? Есть ли недостатки в использовании того и другого?

const config = require('config.json');
const redis_url = config.redis_url;

//redis setup
const Redis = require('ioredis');
const redis = new Redis(redis_url);

module.exports = {
   test
}

async function test(id) {
   redis.get(id, function (err, result) {
   if (err) {
      console.error(err);
      throw(err);
   } else {
      return result;
   }
});

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 июня 2020

Если нет конфликтов redis ...

Если разные «вспомогательные» модули, о которых вы говорите, не имеют конфликтов при взаимодействии с redis, например при перезаписи / использовании тех же ключей redis , то я не вижу причин не использовать один и тот же экземпляр Redis (как указано в garlicman) и экспортировать его в разные модули, в которых он используется.

В противном случае используйте отдельные базы данных Redis. ..

Если вам действительно требуются отдельные подключения к базе данных Redis, Redis поставляется с 16 базами данных, поэтому вы можете указать, к каким из них подключаться при создании нового экземпляра - см. Ниже:

const redis = new Redis({ // SET UP CONFIG FOR CONNECTION TO REDIS
    port: 6379, // Redis port
    host: 127.0.0.1, // Redis host
    family: 4, // 4 (IPv4) or 6 (IPv6)
    db: 10, // Redis database to connect to
});
0 голосов
/ 17 июня 2020

Обычно то, что я делал бы (например, в Java), - это реализовать любой явный класс с одноэлементным доступом, удерживать соединение и обрабатывать любые ошибки соединения / повторного соединения.

Все модули в Node.js, я полагаю, уже являются синглетонами, но я, вероятно, go буду использовать клиентский класс для его хранения и мои собственные методы доступа. Что-то вроде:

const config = require('config.json');
const Redis = require("ioredis");

class Redis {

    constructor(){
        client = new Redis(config.redis_url);
    }

    get(key) {
        return this.client.get(key);
    }

    set(key, value, ttl) {
        let rp;
        if (ttl === 0) {
            rp = this.client.set(key, value);
        }
        else {
            rp = this.client.set(key, value)
            .then(function(res) {
                this.client.expire(key, ttl);
            });
        }
        return rp;
    }

}

module.exports = new Redis;

Я, вероятно, добавлю метод data_init () для проверки и предварительной загрузки исходной структуры ключ / значение при первом подключении.

...