web-dev-qa-db-fra.com

Puis-je me connecter directement à un serveur Redis à partir de JavaScript exécuté dans un navigateur?

Je sais qu'il existe des bibliothèques de noeuds.js pour Redis; Ce que je voudrais faire est d'exécuter un serveur Redis (soit sur localhost ou sur un hôte serveur quelque part) et de l'appeler directement via HTTP (c'est-à-dire AJAX ou HTTP GET selon les besoins) à partir de JavaScript s'exécutant dans un navigateur. (par exemple, un script Greasemonkey ou Extension Chrome, ou peut-être un bookmarklet ou une balise SCRIPT). Redis a-t-il une API native REST ou HTTP?

32
AlexChaffee

Vous ne pouvez pas vous connecter directement à Redis à partir de JavaScript s'exécutant dans un navigateur, car Redis ne parle pas HTTP. Ce que vous pouvez faire est de placer webdis devant Redis, cela permet de travailler avec une instance Redis via une interface HTTP.

38
Theo

Vous pouvez littéralement vous connecter au serveur Redis via http, ce qui engendre un exploit de sécurité.

Redis est effectivement un serveur HTTP - http://benmmurphy.github.io/blog/2015/06/04/redis-eval-lua-sandbox-escape/

Peut-être que cela pourrait être utilisé pour créer un client javascript pour Redis? Dans les exemples présentés, les commandes sont directement envoyées au serveur Redis, qui les exécute. Cependant, dans la pratique, vous pouvez utiliser openresty + nginx devant redis pour essentiellement parler directement à redis via http et bénéficier ainsi des performances du serveur multithread de nginx, qui partagera un nombre limité de connexions avec redis.

2
eyeApps LLC

Comme @Theo l'a expliqué, vous ne pouvez pas vous connecter directement, mais si vous avez des webdis et des redis mis en place, alors j'ai une bibliothèque qui élimine les bêtises avec ajax vous-même, en faveur d'une approche basée sur des promesses.

webdismay est une bibliothèque JS que je viens de publier (Licence: MIT) pour se connecter à un backdis webdis + redis à partir du navigateur. Il adopte une approche ES6 Promises pour communiquer avec le serveur principal redis + webdis, en fournissant functions pour les commandes redis génériques et sans clé et les classes organisées pour les commandes qui fonctionnent sur Keys/Strings , Listes , Hash et Ensembles . Toutes les fonctions/méthodes renvoient ES6 Promises. 

En supposant que votre webdis soit configuré avec redis, dans la configuration par défaut pour accepter les demandes de publication de "/", puis avec webdismay, un exemple simple d'envoi de données au serveur et de leur récupération ultérieure ressemblerait à ceci sur le navigateur (dans 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!

Au moment où j'écris ceci (juillet 2016), les deux premières lignes import nécessitent une aide à la traduction et à la création d'empaquetage à l'aide d'outils tels que jspm ou browserify (si vous modifiez la variable import en require). 

Ce n'est pas encore vraiment convivial pour les débutants, mais cela pourrait permettre à quelqu'un d'utiliser webdis + redis à partir du navigateur sans traduire mentalement entre idiomes javascript et redis et écrire leur propre fichier ajax.

1
Paul

Webdis est très très lent comparé à l’utilisation d’un serveur NGINX devant Redis 

Si vous venez d'implémenter un simple client redis dans mod-Perl et que vous exposez derrière nginx, vous pouvez facilement obtenir de très bonnes performances. Et vous pouvez aussi gérer beaucoup de logique

0
Ram