Redis客户端在解耦的node.js应用程序中

时间:2015-04-26 11:43:55

标签: javascript node.js express redis

您好我在node.js应用中使用redis进行用户缓存。在用户被插入之后,高速缓存用户信息,并且在每个其他请求上访问用户信息以确定用户具有什么访问权限并且客户端基于此接收信息,视图等。 现在,应用程序在开头创建一个redisClient,并将其传递给所需的快速路由回调(几乎所有这些都是)。说实话,我真的不喜欢到处传递的额外论点 - 特别是当它是相同的时候。 有没有更好的方法,例如,如果我初始化每个模块中的redisClient将有额外的开销

mpJs <- newCache $ \() -> buildJs
action $ do
    mpJs <- mpJs ()
    need $ Map.keys mpJs
"//*.js" %> \out -> do
    mpJs <- mpJs ()
    mpJs Map.! out

我想知道的是,如果有一种很好的方法可以删除redisClient参数。

1 个答案:

答案 0 :(得分:3)

您可以通过中间件将客户端与每个请求一起传递:

// initialization
var client = redis.createClient(...);

app.use(function(req, res, next) {
  req.redis = client;
  next();
});

// a route handler
app.get('/', function(req, res) {
  req.redis.get(...);
  ...
});

或者,如果适用,您可以创建一个更复杂的中间件,它将自己执行缓存查找并将用户数据与请求一起传递,因此您不必在每个请求处理程序中执行查找。 / p>

或者您可以将Redis客户端初始化移动到单独的模块,并要求您从每个文件中获取它:

// redis-client.js
var redis = require('redis');
module.exports = redis.createClient(...);

// elsewhere
var client = require('./redis-client');

app.get('/', function(req, res) {
  client.get(...);
  ...
});

于2019年1月16日补充

请记住,使用此技术,只要添加{{1},即使某些内容(例如 Ctrl + C )断开服务器连接,您也可以轻松关闭连接}。

client.quit()