有没有办法使用客户端(而不是Node.js)直接连接到Redis的JavaScript?
我已经为几个项目成功地使用了Node.js + PHP + Redis + Socket.io(用于客户端)。 不过,我真的认为这可以进一步简化为像PHP + Redis +浏览器JavaScript的东西 – 取出Node.js服务器,这是另一个服务器,我宁愿不使用,如果没有必要的。 对于简单的事情,我认为使用Javascript直接连接到Redis会更好。
据我所知,Redis只是通过一个端口来提供请求,所以任何可以向这个端口提出请求的语言都可以工作。 从理论上讲,你不能只使用客户端JavaScript的Redis服务器的端口?
我最感兴趣的是发布/订阅function,可能或不可能。
我不确定您是否可以使用AJAX访问非端口80端口,但是您在技术上应该能够使用Nginx反向代理将某个Redis的端口转发到端口80。
有任何想法吗? 只是一个想法。 我对目前的解决scheme感到非常满意,但是如果我们能够做得更好或者更高效,我们也不会感到痛苦。
您只能使用客户端JavaScript和某些浏览器中的websockets进行HTTP请求。 但是,您应该查看Webdis 。 它向Redis添加了一个简单的HTTP / JSON图层,并且应该按照您的要求进行操作。
编辑:链接固定。
真正的障碍是克服浏览器中的ajax请求的非端口80/443限制。 即使使用Webdis解决方案,由于它通过默认运行在端口7379上,如果运行在端口80上,它将与Apache或Nginx进程发生冲突。
我的建议是使用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> "); }); } });
要么
你可以使用:
我发现直接的Redis http接口不能很好地与pub / sub配合使用,或者很难建立(在编写的时候)。
这是我基于predis示例的pub / sub的“解决方法”。
我在php中有一堆预定义的redis访问器,我使用“路由器”风格的函数通过jQuery的$ .post请求从客户端使用它们。 路由器只是一个大开关:
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界面。