使用(客户端)javascript直接连接到Redis?

2022-08-30 21:07: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。

有什么想法吗?只是一个想法。我对我目前的解决方案非常满意,但想知道我们是否可以做得更好或更有效率也没有什么坏处。


答案 1

您只能使用客户端 JavaScript 发出 HTTP 和 websockets 请求。但是,您应该查看Webdis。它为Redis添加了一个简单的HTTP / JSON层,应该完全按照你的意愿去做。

编辑:链接已修复。


答案 2

真正的障碍是克服浏览器中ajax请求的非端口80/443限制;即使使用Webdis解决方案,因为它通过defaul,t在端口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 并自行解析响应。