Должен ли я создать новый клиент 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.

Ответы на вопрос(2)

Решение Вопроса

они создают соединение 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 );
          } );
        } );
      } );
    });
};
 13 июн. 2012 г., 12:08
Библиотека redis, возможно, не подготовлена для одновременных запросов к одному и тому же соединению, поэтому вы должны использовать ТОЛЬКО одно соединение для всех запросов, если вы на 100% уверены, что библиотека redis способна обработать это правильно.

в противном случае код превратится в суп. Я также использую 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()

Ваш ответ на вопрос