web-dev-qa-db-de.com

Kann ich aus JavaScript, das in einem Browser ausgeführt wird, eine direkte Verbindung zu einem Redis-Server herstellen?

Ich weiß, dass es für Redis node.js-Bibliotheken gibt. Ich möchte einen Redis-Server ausführen (entweder auf einem lokalen Host oder auf einem Serverhost) und ihn direkt über HTTP (dh AJAX oder HTTP GET nach Bedarf) aus JavaScript aufrufen, das in einem Browser ausgeführt wird (z. B. ein Greasemonkey- oder Chrome-Erweiterungsskript oder ein Lesezeichen oder ein SCRIPT-Tag). Hat Redis eine native REST oder HTTP-API?

32
AlexChaffee

Sie können keine direkte Verbindung zu Redis von JavaScript aus in einem Browser herstellen, da Redis kein HTTP spricht. Was Sie tun können, ist webdis vor Redis zu setzen, damit Sie mit einer Redis-Instanz über eine HTTP-Schnittstelle arbeiten können.

38
Theo

Sie können sich buchstäblich über http mit dem Redis-Server verbinden, und es gibt einen Sicherheits-Exploit, der auf diesem basiert.

Redis ist effektiv ein HTTP-Server - http://benmmurphy.github.io/blog/2015/06/04/redis-eval-lua-sandbox-escape/

Vielleicht könnte man daraus einen Javascript-Client für Redis machen? In den gezeigten Beispielen werden Befehle direkt an den Redis-Server gesendet, der sie ausführt. In der Praxis können Sie jedoch openresty + nginx vor redis verwenden, um im Wesentlichen direkt mit redis über http zu kommunizieren, und den Leistungsvorteil des Multithread-Servers von nginx nutzen, der eine begrenzte Anzahl von Verbindungen zu redis selbst verwendet.

2
eyeApps LLC

Wie @Theo erklärt hat, können Sie keine direkte Verbindung herstellen, aber wenn Sie webdis und redis eingerichtet haben, habe ich eine Bibliothek, in der Sie sich selbst mit ajax verzetteln können, zugunsten eines Versprechens-basierten Ansatzes.

webdismay ist eine kürzlich von mir veröffentlichte JS-Bibliothek (License: MIT), um eine Verbindung mit einem webdis + redis-Backend vom Browser aus herzustellen. Die Kommunikation mit dem redis + webdis-Backend erfordert einen ES6-Promises-Ansatz, der Funktionen für generische und schlüssellose Redis-Befehle und organisierte Klassen für Befehle zur Verfügung stellt, die auf Tasten/Strings , Lists , arbeiten. Hash und Sets . Alle Funktionen/Methoden liefern ES6-Versprechen. 

Angenommen, Sie haben webdis mit redis eingerichtet. In der Standardkonfiguration, um Post-Anforderungen an "/" zu akzeptieren. Dann mit webdismay ein einfaches Beispiel für das Senden von Daten an den Server und das spätere Abrufen dieser Daten auf dem Browser (in 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!

Zum Zeitpunkt der Erstellung dieses Dokuments (Juli 2016) benötigen die ersten beiden import-Zeilen Unterstützung bei der Übersetzung und beim Packen von Tools wie jspm oder browserify (wenn Sie die import in require ändern). 

Dies ist zwar nicht gerade anfängerfreundlich, könnte aber jemandem erlauben, webdis + redis vom Browser aus zu verwenden, ohne ständig zwischen Javascript-Idiomen und redis zu übersetzen und seinen eigenen Ajax zu schreiben.

1
Paul

Webdis ist sehr langsam, verglichen mit einem NGINX-Server vor Redis 

Wenn Sie einfach einen einfachen Redis-Client in Mod-Perl implementieren und hinter Nginx verfügbar machen, können Sie leicht eine sehr gute Leistung erzielen. Und Sie können auch mit viel Logik umgehen

0
Ram