使用(客户端)javascript 直接连接到 Redis?
Posted
技术标签:
【中文标题】使用(客户端)javascript 直接连接到 Redis?【英文标题】:Connecting directly to Redis with (client side) javascript? 【发布时间】:2011-09-12 19:25:26 【问题描述】:有没有办法使用客户端(不是 Node.js)javascript 直接连接到 Redis?
我已经在几个项目中成功地使用了 Node.js + php + Redis + Socket.io(用于客户端)。但是,我真的认为这可以进一步简化为 PHP + Redis + Browser javascript 之类的东西 - 取出 Node.js 服务器,它只是另一个我不想在没有必要时使用的服务器。对于简单的事情,我认为直接使用 Javascript 连接到 Redis 会更好。
据我了解,Redis 只是通过端口服务其请求,因此任何可以向该端口发出请求的语言都可以工作。理论上,你不能直接使用客户端 javascript 访问 redis 服务器的端口吗?
我最感兴趣的是发布/订阅功能,这可能是可能的,也可能是不可能的。
我不确定您是否可以使用 AJAX 访问非端口 80 端口,但从技术上讲,您应该能够使用 nginx 反向代理或其他方式将 Redis 的端口转发到端口 80。
有什么想法吗?只是一个想法。我对我目前的解决方案非常满意,但不知道我们是否可以做得更好或更有效。
【问题讨论】:
另见***.com/a/38587333/103081 【参考方案1】:您只能使用客户端 JavaScript 以及在某些浏览器中的 websocket 发出 HTTP 请求。但是,您应该查看Webdis。它为 Redis 添加了一个简单的 HTTP/JSON 层,并且应该完全符合您的要求。
编辑:链接已修复。
【讨论】:
Webdis 看起来很酷。我想知道在具有多个用户数据的实际应用程序中,您将如何处理访问控制,或者这对于全/全访问级别是否最有用。 我相信您正在链接到该项目的一个分支。真实网址可以位于:webd.is【参考方案2】:真正的障碍是克服浏览器中 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> ");
);
);
或
你可以使用:
http://wiki.nginx.org/HttpRedis 并自己解析响应。
【讨论】:
【参考方案3】:我发现直接 Redis http 接口不能很好地与 pub/sub 配合使用,或者难以设置(在撰写本文时)。
这是我基于 predis 示例的 pub/sub 的“解决方法”。
http://bradleygoldsmith.tumblr.com/post/35601539836/quick-and-dirty-redis-subscribe-publish-notifications
【讨论】:
这个方法还能用吗?我关注了您的博文并调用了您创建的 php 文件并输入了您在帖子中显示的 Ajax 调用,但它超时了。并且永远不会调用ajax的成功函数。有更新吗?【参考方案4】:我在 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 接口。
【讨论】:
感谢您的评论!如此简单的解决方案,它绝对有效。我认为像 Webdis 这样的东西更符合我的要求(绕过了对 PHP 服务器/“路由器”的需求——PHP 在 IMO 中并不是最好的东西)。以上是关于使用(客户端)javascript 直接连接到 Redis?的主要内容,如果未能解决你的问题,请参考以下文章
使用 javascript 聊天客户端 (jsjac) 连接到远程 jabber 服务器
将 JavaScript WebSocket 连接到 C winsock
JavaScript 客户端无法连接到 Spring 4 WebSocket