使用(客户端)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 访问器,我使用“路由器”样式的函数通过带有 jQ​​uery 的 $.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-&gt;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 服务器

使用 R 通过 SSL 连接到 Postgres

将 JavaScript WebSocket 连接到 C winsock

JavaScript 客户端无法连接到 Spring 4 WebSocket

如何连接到它反应的 websocket 而不是普通的 javascript?

通过 R 连接到 AWS Redshift - Mac OSX