我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗?

Posted

技术标签:

【中文标题】我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗?【英文标题】:Can I connect directly to a Redis server from JavaScript running in a browser? 【发布时间】:2011-08-11 04:12:00 【问题描述】:

我知道有用于 Redis 的 node.js 库;我想做的是运行一个 Redis 服务器(在本地主机上或在某处的服务器主机上)并直接通过 HTTP(即根据需要 AJAX 或 HTTP GET)从在浏览器中运行的 javascript 调用它(即 Greasemonkey 或 Chrome扩展脚本,或者可能是小书签或 SCRIPT 标签)。 Redis 是否有原生 REST 或 HTTP API?

【问题讨论】:

我正在考虑再次问这个问题,但规定我们想要一个“真实的”,就像在浏览器中运行的实时 redis 客户端——而不是 HTTP 任何东西——一样。可以构建一个伟大的实时“基础设施”,仅使用 CDN 服务资产构成客户端 webapp 直接与 Redis 通信。我想删除系统中不必要的 WebSocket 服务器方面。所有的控制逻辑都可以内化到Lua中的redis集群中。 ***.com/questions/33241247/… 【参考方案1】:

您无法通过在浏览器中运行的 JavaScript 直接连接到 Redis,因为 Redis 不支持 HTTP。你可以做的是把webdis放在Redis前面,这样就可以通过HTTP接口使用Redis实例。

【讨论】:

目前没有Windows实现:github.com/nicolasff/webdis/issues/138【参考方案2】:

你可以通过 http 直接连接到 redis 服务器,并且有一个基于此的安全漏洞。

Redis 实际上是一个 HTTP 服务器 -- http://benmmurphy.github.io/blog/2015/06/04/redis-eval-lua-sandbox-escape/

也许这可以用来为redis制作一个javascript客户端?在所示示例中,命令直接发送到执行它们的 redis 服务器。然而,实际上,你可以在 redis 前面使用 openresty+nginx 本质上直接通过 http 与 redis 对话,并获得 nginx 的多线程服务器的性能优势,它将与 redis 本身共享一组有限的连接。

【讨论】:

【参考方案3】:

与在 redis 前面使用 NGINX 服务器相比,Webdis 非常非常慢

如果你只是在 mod-perl 中实现一个简单的 redis 客户端,并在 nginx 后面暴露,你可以轻松获得非常好的性能。你也可以处理很多逻辑

【讨论】:

作为 Webdis 的作者并且做过 许多 的 Webdis 基准测试和替代方案,我强烈不同意这种说法。 Webdis 是多线程的,很容易使单线程 Redis 实例饱和,这很快成为基准测试的瓶颈。在我开发 Webdis 时,我与Redis nginx module 的作者进行了讨论,我们都得出了 Webdis 更快的结论。此外,使用 mod-perl 的建议不太可能带来比使用 Webdis 更好的性能——恰恰相反。【参考方案4】:

正如@Theo 解释的那样,您不能直接连接,但如果您设置了 webdis 和 redis,那么我有一个库,可以消除自己使用 ajax 的麻烦,支持基于承诺的方法。

webdismay 是我最近发布的一个 JS 库(许可证:MIT),用于从浏览器连接到 webdis+redis 后端。它采用 ES6 Promises 方法与 redis+webdis 后端进行通信,为通用和无键 redis 命令提供functions,并为在Keys/Strings、Lists、Hash 和Sets 上运行的命令提供组织类。所有函数/方法都返回 ES6 Promises。

假设您使用 redis 设置了 webdis,在默认配置中接受对“/”的发布请求,然后使用 webdismay 向服务器发送数据并稍后取回数据的简单示例在浏览器上看起来像这样(在 ES6 中):

import 'whatwg-fetch';  // fetch polyfill
import * as W from 'webdismay';
const k = W.key('some-redis-key');
k.set('Hello, World!');  // store the information
// wait a while, e.g. in the dev console or with setTimeout()
k.get().then((v)=>console.log(v));  // --> Hello, World!

在我撰写本文时(2016 年 7 月),前两行 import 需要 jspm 或 browserify 等工具提供一些翻译和打包帮助(如果您将 import 更改为 require)。

这对初学者来说并不完全友好,但可以允许某人从浏览器中使用 webdis+redis,而无需在 javascript 成语和 redis 之间不断转换并编写自己的 ajax。

【讨论】:

以上是关于我可以从浏览器中运行的 JavaScript 直接连接到 Redis 服务器吗?的主要内容,如果未能解决你的问题,请参考以下文章

从运行在 Web 浏览器控件中的 JavaScript 脚本调用 C++ 函数

vscode怎么运行javascript

如何使用javascript直接从网页录制

javascript(js)文件下载后不能正常运行疑问

文件上传正在使用 Postman,但不适用于从浏览器运行的 Javascript

如何在 Javascript 中选择合适的后置摄像头?