Source de données : Redis


1Présentation

Temma peut gérer les bases de données non relationnelles reposant sur le serveur Redis.

Si vous avez correctement configuré les paramètres de connexion à la base Redis, Temma crée automatiquement un objet de type \Temma\Datasources\Redis. Par convention, nous partirons du principe que vous avez nommé cette connexion ndb dans le fichier etc/temma.php (voir la documentation de la configuration).

La connexion est alors disponible dans le contrôleur en écrivant :

$this->ndb

Dans les autres objets gérés par le composant d'injection de dépendances, la connexion à la base de données est accessible en écrivant :

$loader->dataSources['ndb']

2Configuration

Dans le fichier etc/temma.php (voir la documentation de la configuration), vous déclarez le DSN (Data Source Name) qui permet de se connecter au serveur Redis.

Le DSN de connexion à un serveur Redis s'écrit de la forme : redis://SERVEUR[:PORT][/BASE]
Le numéro de port est le 6379 par défaut.
Le numéro de base est le 0 (zéro) par défaut.
Exemple : redis://localhost

Si le serveur Redis s'exécute sur la même machine, il est possible de se connecter en utilisant une socket Unix, permettant d'éviter les latences réseau. Dans ce cas, le DSN est de la forme : redis-sock://CHEMIN[#BASE]
Le chemin doit mener à la socket Unix (souvent /var/run/redis.sock).
Le numéro de base est le 0 (zéro) par défaut.
Exemple : redis-sock:///var/run/redis.sock#2


3Appels unifiés

3.1Accès de type tableau

// vérification de l'existence d'une donnée
if (isset($this->ndb['key1']))
    doSomething();

// lecture de données (désérialisées)
$data = $this->ndb['key1'];

// écriture de données (sérialisées)
$this->ndb['key1'] = $value;

// effacement de données
unset($this->ndb['key1']);

// nombre d'éléments
$nbr = count($this->ndb);

3.2Méthodes générales

// vérification de l'existence d'une donnée
if ($this->ndb->isSet('user:1'))
    doSomething();

// effacement de donnée
$this->ndb->remove('user:1');

// effacement de plusieurs données
$this->ndb->mRemove(['user:1', 'user:2', 'user:3']);

// effacement de données à patir d'une expression régulière
$this->ndb->clear('user:.*');

// effacement de toutes les données
$this->ndb->flush();

3.3Gestion de données complexes sérialisées

// recherche de clés correspondant à une expression régulière
$users = $this->ndb->search('user:.*');

// recherche de clés à partir d'un préfixe,
// avec récupération des données (désérialisées)
$users = $this->ndb->search('user:.*', true);

// lecture de données (désérialisées)
$user = $this->ndb->get('user:1');
// lecture de données avec valeur par défaut
$color = $this->ndb->get('color', 'blue');
// lecture de données avec création de données si nécessaire
$user = $this->ndb->get("user:$userId", function() use ($userId) {
    return $this->dao->get($userId);
});

// lecture de plusieurs données (désérialisées)
$users = $this->ndb->mGet(['user:1', 'user:2', 'user:3']);

// écriture de données (sérialisées)
$this->ndb->set('user:1', $userData);
// écriture de données (sérialisées) avec une durée de vie d'une heure
$this->ndb->set('user:1', $userData, 3600);

// écriture de plusieurs données (sérialisées)
$this->ndb->mSet([
    'user:1' => $user1data,
    'user:2' => $user2data,
    'user:3' => $user3data,
]);
// écriture de plusieurs données, avec une durée de vie d'une heure
$this->ndb->mSet([
    'user:1' => $user1data,
    'user:2' => $user2data,
], 3600);

3.4Gestion de données brutes

// lecture de données (brutes)
$html = $this->ndb->read('page:home');
// lecture de données avec valeur par défaut
$html = $this->ndb->read('page:home',
                         '<html><body><h1>Homepage</h1><body><html>');
// lecture de données avec création de données si nécessaire
$html = $this->ndb->read('page:home', function() {
    return file_get_contents('/path/to/homepage.html');
});

// lecture de plusieurs données (brutes)
$pages = $this->ndb->mRead(['page:home', 'page:admin', 'page:products']);

// copie d'une donnée dans un fichier local
$this->ndb->copyFrom('page:home', '/path/to/newpage.html');
// copie d'une donnée dans un fichier local, avec valeur par défaut
$this->ndb->copyFrom('page:home', '/path/to/newpage.html', $defaultHtml);
// copie d'une donnée dans un fichier local,
// avec création de données si nécessaire
$this->ndb->copyFrom('page:home', '/path/to/newpage.html', function() {
    return file_get_contents('/path/to/oldpage.html');
});
// copie d'une donnée dans un fichier local,
// avec création de données si nécessaire (avec une durée de vie d'une heure)
$this->ndb->copyFrom('page:home', '/path/to/newpage.html', function() {
    return file_get_contents('/path/to/oldpage.html');
}, 3600);

// écriture de donnée (brute)
$this->ndb->write('color:blue', '#0000ff');
// écriture de donnée (brute) avec une durée de vie d'une heure
$this->ndb->write('color:blue', '#0000ff', 3600);

// écriture de plusieurs données (brutes)
$this->ndb->mWrite({
    'color:blue'  => '#0000ff',
    'color:red'   => '#ff0000',
    'color:green' => '#00ff00',
]);
// écriture de plusieurs données avec une durée de vie d'une heure
$this->ndb->mWrite({
    'color:blue'  => '#0000ff',
    'color:red'   => '#ff0000',
], 3600);

// écriture d'une donnée (brute) à partir d'un fichier local
$this->ndb->copyTo('page:home', '/path/to/homepage.html');
// écriture d'une donnée à partir d'un fichier local, avec une durée de vie d'une heure
$this->ndb->copyTo('page:home', '/path/to/homepage.html', 3600);

// écriture de plusieurs données (brutes) à partir de fichiers locaux
$this->ndb->mCopyTo([
    'page:home'     => '/path/to/homepage.html',
    'page:admin'    => '/path/to/admin.html',
    'page:products' => '/path/to/products.html',
]);
// écriture de plusieurs données à partir de fichiers locaux
// avec une durée de vie d'une heure
$this->ndb->mCopyTo([
    'page:home'  => '/path/to/homepage.html',
    'page:admin' => '/path/to/admin.html',
], 3600);