2

这有点难以表达,所以我希望我的标题不会太糟糕。

我有一个前端/后端 React/Node.js(REST API) Web 应用程序,我想添加 Redis 支持来存储检索应用程序全局设置和每个用户的特定设置(如语言首选项、上次登录等...简单东西)所以我正在考虑向我的后端 REST API 添加一个 /settings 分支,以从 redis 实例推送/拉取这些信息。

这就是我对 Node.js 缺乏经验的地方。我正在考虑使用 ioredis 客户端,它似乎太容易了。如果我有几个助手(多个.js 将调用redis)将客户端构建为const每个中的一个安全吗?或者是否有另一种推荐的方法来重用它的单个实例?

这是我正在考虑做的一个示例。想象一下,如果我有 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;
   }
});

谢谢你。

4

2 回答 2

2

如果没有redis冲突...

如果您所指的不同“帮助器”模块在与 redis 交互时没有冲突,例如覆盖/使用相同的 redis 键,那么我看不出有任何理由不使用相同的 redis 实例(如大蒜人所述)并将其导出到使用它的不同模块。

否则使用单独的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
});
于 2020-06-30T20:29:03.327 回答
0

通常我会做的(用Java说)是实现任何具有单例访问的显式类,以保持连接和任何连接错误/重新连接处理。

我相信 Node.js 中的所有模块都已经是单例了,但我可能会使用一个客户端类来保存它和我自己的访问相关方法。就像是:

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() 方法来检查并在第一次连接时预加载初始键/值结构。

于 2020-06-17T14:15:19.337 回答