使用(客户端)javascript直接连接Redis
Connecting directly to Redis with (client side) javascript?
有没有一种方法可以使用客户端(而不是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。
有什么想法吗?只是一个想法。我对我目前的解决方案很满意,但想知道我们是否可以做得更好或更有效也没什么坏处。
您只能使用客户端JavaScript发出HTTP和websockets请求。但是,您应该查看Webdis。它为Redis添加了一个简单的HTTP/JONS层,应该可以做你想要做的事情。
编辑:链接已修复。
真正的障碍是克服浏览器中ajax请求的非端口80/443限制;即使使用Webdis解决方案,因为它通过defaul,t从7379端口运行,如果从80端口运行,也会与Apache或Nginx进程冲突。
我的建议是使用nginxproxy_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并自己解析响应。
我发现直接Redis http接口与pub/sub不太好用,或者很难设置(在撰写本文时)。
以下是我基于predis示例针对pub/sub的"变通方法"。
http://bradleygoldsmith.tumblr.com/post/35601539836/quick-and-dirty-redis-subscribe-publish-notifications
我在php中有一堆预定义的redis访问器,我使用一个"router"风格的函数通过带有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接口。
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 如何使用密码检测网络中的状态连接
- 如何处理node.js节点mongodb中的连接和查询队列
- Rails-JQueryUIAutcomplete和AJAX不工作,可以't连接到数据库
- Twilio-显示所有连接参与者的远程参与者视频
- 操作放置在画布上的元素之间的连接
- TypeError:_this.store.getState在使用来自Redux的连接时不是函数
- jQuery UI可排序-多连接列表拖动
- 如何使用offer/answer交换来自两个对等连接的流
- 单个 Redis 客户端连接是否支持并发读写
- 如何在数据库断开连接时处理Redis会话
- 如何在 redis 中将 JS 对象传递给它自己的事件参数 - 连接事件上的哨兵
- 是否可以从浏览器创建与 redis 服务器的连接
- 具有redis连接的外部数据库
- redis的处理能力;N'没有连接
- node.js连接redis redis.get(key,callback)返回null
- 如何使用node.js, socket .js触发事件在连接的客户端上触发.IO和redis
- 我应该保持我的redis连接持久吗?
- 使用(客户端)javascript直接连接Redis
- Redis连接失败