Подключение непосредственно к Redis с (на стороне клиента) javascript?
Есть ли способ напрямую подключиться к 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 или что-то в этом роде.
Любые идеи? Просто мысль. Я очень доволен своим текущим решением, но мне не больно задаться вопросом, можем ли мы сделать это еще лучше или эффективнее.
Ответы
Ответ 1
Вы можете делать только HTTP-запросы с клиентским JavaScript и, в некоторых браузерах, websockets. Однако вы должны изучить Webdis. Он добавляет простой слой HTTP/JSON в Redis и должен делать именно то, что вы хотите.
Изменить: Ссылка исправлена.
Ответ 2
Реальное препятствие преодолевает ограничение порта 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 и самостоятельно проанализируйте ответ.
Ответ 3
Я обнаружил, что прямые интерфейсы интерфейса Redis не очень хорошо работают с pub/sub или их трудно настроить (на момент написания).
Вот мой "обходной путь" для pub/sub на основе примеров predis.
http://bradleygoldsmith.tumblr.com/post/35601539836/quick-and-dirty-redis-subscribe-publish-notifications
Ответ 4
У меня есть куча предопределенных помощников 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 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 общего назначения.