Прямое подключение к Redis с помощью (на стороне клиента) javascript? - PullRequest
19 голосов
/ 11 июня 2011

Есть ли способ прямого подключения к Redis с помощью клиентского (не Node.js) javascript?

Я уже успешно использую Node.js + PHP + Redis + Socket.io (для клиента) для нескольких проектов. Тем не менее, я действительно думаю, что это можно было бы еще больше упростить до чего-то вроде PHP + Redis + Browser javascript - убрав сервер Node.js, который является просто еще одним сервером, который я бы предпочел не использовать, если в этом нет необходимости. Для простых вещей, я думаю, было бы лучше просто подключиться напрямую к Redis с помощью Javascript.

Из того, что я понимаю, Redis просто передает свой запрос через порт, так что любой язык, который может делать запросы к этому порту, будет работать. Теоретически, не могли бы вы просто подключиться к порту сервера redis с помощью клиентского JavaScript?

Меня больше всего интересуют функции публикации / подписки, которые могут быть или не быть возможными.

Я не уверен, что вы можете получить доступ к порту, отличному от порта 80, с помощью AJAX, но технически вы должны перенаправить порт Redis на порт 80, используя обратный прокси-сервер Nginx или что-то в этом роде.

Есть идеи? Просто мысль. Я очень доволен своим текущим решением, но не больно задаться вопросом, можем ли мы сделать это еще лучше или эффективнее.

Ответы [ 4 ]

13 голосов
/ 11 июня 2011

Вы можете отправлять HTTP-запросы только с помощью клиентского JavaScript и, в некоторых браузерах, веб-сокетов.Тем не менее, вы должны посмотреть на Webdis .Он добавляет простой слой HTTP / JSON в Redis и должен делать именно то, что вы хотите.

Редактировать: Ссылка исправлена.

7 голосов
/ 20 сентября 2012

Настоящим препятствием является преодоление ограничения 80/443 на отсутствие порта для запроса ajax в браузере; Даже с решением Webdis, поскольку оно по умолчанию запускает порт 7379, t и будет конфликтовать с вашим процессом Apache или Nginx, если запущен порт 80.

Мой совет - использовать nginx proxy_pass для указания на процесс webdis. Вы можете перенаправить трафик на порт 80 и выполнить ajax-запрос без проблем с безопасностью.

Ниже приведен пример конфигурации NGINX, которая, похоже, помогает мне.

upstream WebdisServerPool 
{
    server 127.0.0.1:7379; #webdis server1
    server 192.168.1.1:7379; #webdis server 2
}


server {

    listen   80; #
    root /path/to/my/php/code/;
    index index.php;
    server_name yourServerName.com;

    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
            expires max;
            log_not_found off;
    }

    location / {
            # Check if a file exists, or route it to index.php.
            try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME /path/to/my/php/code/$fastcgi_script_name;

    }

    location /redis {

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            rewrite /(.*)/(.*)/(.*)$ /$2/$3 break; #ignore the /redis
             proxy_redirect off;
            proxy_pass http://webdisServerPool;
    }
}

На переднем торце приведен пример получения всех ключей. Все запросы redis будут проходить через / redis, например:

$.ajax({ 
        url: "/redis/KEYS/*", 
        method: 'GET', 
        dataType: 'json', 
        success:function(data)
        {
            $each(data.KEYS,function(key,value){            
                $('body').append(key+"=>"+value+" <br> ");
            });
        }
});

OR

Вы можете использовать:

http://wiki.nginx.org/HttpRedis и проанализируйте ответ самостоятельно.

3 голосов
/ 13 ноября 2012

Я обнаружил, что прямые http-интерфейсы Redis не очень хорошо работают с pub / sub или их сложно настроить (на момент написания).

Вот мой «обходной путь» для pub /sub на основе предыдущих примеров.

http://bradleygoldsmith.tumblr.com/post/35601539836/quick-and-dirty-redis-subscribe-publish-notifications

1 голос
/ 10 января 2012

У меня есть несколько предопределенных аксессоров redis в php, и я использую функцию в стиле 'router', чтобы использовать их от клиента через запросы $ .post с jQuery.Маршрутизатор - это просто большой коммутатор:

 public function router() {
$response = array();
switch ($_POST['method']) {
case 'get_whole_list': //is a convenience function with arg $list_key
  if ($_POST['list_key']) {//which will be provided by the POST request data
$response = $this->get_whole_list($_POST['list_key']);
break;
  } else {
$response = (array('error' => 'must be passed with post key "list_key"'));
break;
  } //and so on, until

//it's time to send the response: 
return json_encode(array('response' => $response));
}

, а затем вы просто echo $myClass->router()

Я обращаюсь к нему с помощью jQuery, например:

redgets.get_whole_list = function(key, callback) {
    $.post(redgets.router, //points to my php file
       {method: 'get_whole_list', //tells it what to do
       list_key: key}, //provides the required args
       function(data) {
           callback($.parseJSON(data).response); //parses the response
       });

все это работает нормально;возможно, это не идеально, но это делает сервер node.js избыточным.Я удивлен, что никто еще не сделал универсальный интерфейс redis в этом стиле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...