Есть ли способ напрямую подключиться к 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 или что-то в этом роде.
Есть идеи? Просто мысль. Я очень доволен своим текущим решением, но мне не помешает задаться вопросом, можем ли мы сделать это еще лучше или эффективнее.
Вы можете делать только HTTP-запросы с клиентским JavaScript и, в некоторых браузерах, websockets. Однако вы должны изучить Webdis . Он добавляет легкий слой HTTP / JSON для Redis и должен делать именно то, что вы хотите.
Изменить: Ссылка исправлена.
Настоящим препятствием является преодоление ограничения, не связанного с портом 80/443 для запроса ajax в браузере; Даже с решением Webdis, поскольку он запускает порт 7379 с помощью defaul, 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> "); }); } });
ИЛИ
Вы можете использовать:
http://wiki.nginx.org/HttpRedis и проанализируйте ответ самостоятельно.
Я обнаружил, что прямые интерфейсы Redis http не очень хорошо работают с pub / sub или их трудно настроить (на момент написания).
Вот мой «обходной путь» для pub / sub на основе примеров predis.
У меня есть куча предопределенных помощников 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 общего назначения.