1

我正在看这个代码片段:

var addSnippet = function( req, res ) {
  getPostParams( req, function( obj ) {
      var r = redis.createClient();

      r.stream.on( 'connect', function() {
        r.incr( 'nextid' , function( err, id ) {
          r.set( 'snippet:'+id, JSON.stringify( obj ), function() {
            var msg = 'The snippet has been saved at <a href="/'+id+'">'+req.headers.host+'/'+id+'</a>';
            res.respond( msg );
          } );
        } );
      } );
    });
};

它来自这里:http ://howtonode.org/node-redis-fun 。

我不太明白发生了什么事。从示例中,我认为 Redis 客户端是数据库和程序员之间的某种接口,但现在似乎他们正在为每个代码提交创建一个新客户端(他们在教程中构建的应用程序是接受代码片段提交并将它们存储在数据库中)!

另外,Redis 数据库存储在哪里?在与脚本相同的目录中?我该如何改变它?

我将 Redis 与 Node.js 一起使用。

4

2 回答 2

4

呃,看起来他们正在为每个客户端创建一个 redis 连接。这绝对不推荐。

Redis 是一个数据库。这就像 MySQL。您可以通过客户端访问它,但它是在您的服务器上运行的程序。数据由它处理,因此您不必担心它在哪里。如果您确实担心,可以查看 redis 配置。更多信息在这里:http ://redis.io (文档非常好)。

要“修复”代码并仅使用一个客户端,您必须像这样使用它:

/**
 * Move this at the top, this way it's not run once per client,
 * it is run once the node program is launched.
 */
var r = redis.createClient();

var addSnippet = function( req, res ) {
  getPostParams( req, function( obj ) {    
      r.stream.on( 'connect', function() {
        r.incr( 'nextid' , function( err, id ) {
          r.set( 'snippet:'+id, JSON.stringify( obj ), function() {
            var msg = 'The snippet has been saved at <a href="/'+id+'">'+req.headers.host+'/'+id+'</a>';
            res.respond( msg );
          } );
        } );
      } );
    });
};
于 2012-06-13T07:19:13.577 回答
2

必须实现连接池,否则代码将陷入困境。我还将 redis 与 django-redis-backend 一起使用,代码片段如下所述。它会给你一个想法。

class CacheConnectionPool(object):

    def __init__(self):
        self._connection_pools = {}

    def get_connection_pool(self, host='127.0.0.1', port=6379, db=1,
                            password=None, parser_class=None,
                            unix_socket_path=None):
        connection_identifier = (host, port, db, parser_class, unix_socket_path)
        if not self._connection_pools.get(connection_identifier):
            connection_class = (
                unix_socket_path and UnixDomainSocketConnection or Connection
                )
            kwargs = {
                'db': db,
                'password': password,
                'connection_class': connection_class,
                'parser_class': parser_class,
            }
            if unix_socket_path is None:
                kwargs.update({
                    'host': host,
                    'port': port,
                })
            else:
                kwargs['path'] = unix_socket_path
            self._connection_pools[connection_identifier] = redis.ConnectionPool(**kwargs)
        return self._connection_pools[connection_identifier]

pool = CacheConnectionPool()
于 2012-06-14T01:51:30.140 回答