2012-06-13 101 views
1

我在看這個代碼片段:我應該爲每個連接創建一個新的Redis客戶端嗎?

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

呃,看起來他們正在爲每個客戶創建一個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); 
      }); 
     }); 
     }); 
    }); 
}; 
+3

Redis的庫也許不是同時請求相同的連接準備,所以你應該只使用所有請求一個連接,如果你是100%肯定的是,Redis的庫能正確處理這個問題。 –

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() 
相關問題