Redis et Nodejs facile avec Nohm

En faisant des recherches sur Redis et Node.js, j’étais tombĂ© sur un projet intĂ©ressant: Nohm https://github.com/maritz/nohm qui est une sorte d’ORM pour Redis. Alors cela cache Ă©normĂ©ment le rĂ©el fonctionnement de Redis, je ne sais pas encore Ă  quel point c’est performant ou pas, il faudra que “je mĂšne l’enquĂȘte” mais je trouve ce framework bien sympathique. Je vous en parle donc un petit peu, en fait je vous explique ce que je suis en train de mettre en Ɠuvre pour aller plus loin dans mes tests.

Plateforme

Pré-requis :

  • node.js
  • npm
  • redis

Ensuite dans un répertoire, créez un fichier package.json avec le contenu suivant:

{
  "name": "play-with-redis",
  "description" : "play-with-redis",
  "version": "0.0.0",
  "dependencies": {
    "nohm": "0.9.5",
    "Faker": "0.7.2",
    "redis": "0.10"
  }
}

Pourquoi Faker? Je veux me crĂ©er une base facilement et Faker permet de gĂ©nĂ©rer des noms, emails, etc. 
 de façon alĂ©atoire (https://github.com/marak/Faker.js/). Nous avons aussi besoin du driver redis pour node.js : https://github.com/mranney/node_redis.

Tapez la commande :

npm install

Patientez, c’est prĂȘt.

“Remplir” la base

Créez un fichier populate.js à la racine avec le contenu suivant:

Déclarez les dépendances et variables:

var Faker = require("Faker")
  , nohm = require('nohm').Nohm
  , redis = require('redis').createClient();

Ne commencez les traitements qu’une fois la base connectĂ©e:

redis.on("ready", function (err) {

  nohm.setClient(redis);

  console.log("Connected"); // il faudrait normalement gérer les erreurs

DĂ©finir un model (c’est la partie intĂ©ressante):

  nohm.model('User', {
    properties: {
      name: {
        type: 'string',
        index: true
      },
      email: {
        type: 'string',
        index: true
      },
      country: {
        type: 'string',
        index: true
      }
    }
  });

Remarque: le fait de préciser pour une propriété index: true permettra de faire des recherches sur la propriété (champ) considéré.

Mettre des données dans la base:

  console.log("Populating Database ...")

  for(var i = 0; i <= 100000; i++) {
    // créer un user
    var user = nohm.factory('User');

    user.p({
       name: Faker.Name.findName()
     , email: Faker.Internet.email()
     , country: Faker.Address.ukCountry()
    });

    user.save(function (err) {});
    console.log(i)
  }

  console.log("the end")
    
});

Vous n’avez plus qu’à lancer, au bout de quelques instants vous disposez d’un jeu d’essai de donnĂ©es.

Interroger la base

Créez un fichier query.js avec le contenu suivant:

Déclarez les dépendances et variables:

var nohm = require('nohm').Nohm
  , redis = require('redis').createClient();

Comme prĂ©cĂ©dement, on attend que la base soit connectĂ©â€, et ensuite on dĂ©finit notre modĂšle:

redis.on("ready", function (err) {

  nohm.setClient(redis);

  console.log("Connected");

  var UserModel = nohm.model('User', {
    properties: {
      id: {
        type: 'string',
        unique: true
      },
      name: {
        type: 'string',
        index: true
      },
      email: {
        type: 'string',
        index: true
      },
      country: {
        type: 'string',
        index: true
      }
    }
  });

Ensuite je veux tous les users qui habitent 'England' et puis afficher le 346 Ăšme avec ses infos:

  //England

  UserModel.find({
    country: 'England'
  }, function (err, ids) {

    console.log("English people", ids.length)

    nohm.factory('User', ids[345], function (err) {
      if (err === 'not found') {
        console.log(err);
      } else if (err) {
        console.log(err); // database or unknown error
      } else {
        console.log(this.allProperties());
      }
    });

  });

Remarque: UserModel.find() va trouver la liste des ids (clĂ©s) correspondants Ă  la recherche, ensuite, nohm.factory('User', id_user, function (err) {}) permet de retrouver les donnĂ©es de l’utilisateur par son id.

J’aime beaucoup le principe, mais Ă  l’heure qu’il est je ne sais pas si c’est utilisable tel quel en production. Il faudrait aussi voir de quelle maniĂšre c’est implĂ©mentĂ© (anti-patterns ou pas).

Il existe aussi une version en Java, mais qui ne semble plus ĂȘtre maintenue depuis un moment : https://github.com/xetorthio/johm, et il semblerait que l’idĂ©e de dĂ©part viennent d’ici https://github.com/soveran/ohm (en Ruby).

Je vais me monter une stack web complÚte pour utiliser Nohm et je vous ferais part de mes résultats.

Vous trouverez les code d’exemples par ici https://github.com/js-experiments/play-with-redis.

Bon WE.

Demain, Angular à nouveau 


blog comments powered by Disqus

Related posts