NoSQL - Redis - Les fondamentaux

1 1 1 1 1 1 1 1 1 1 Rating 3.77 (22 Votes)
Submit to DeliciousSubmit to DiggSubmit to FacebookSubmit to Google PlusSubmit to StumbleuponSubmit to TechnoratiSubmit to TwitterSubmit to LinkedIn

Ce tutoriel vous présente les fondamentaux de Redis. Grâce à ce tutoriel, vous allez installer, configurer, utiliser et administrer Redis de manière simple et efficace.

Redis

Redis (de l'anglais REmote DIctionary Server qui peut-être traduit par « serveur de dictionnaire distant » et jeu de mot avec Redistribute) est un système de gestion de base de données clef-valeur scalable, très hautes performances, écrit avec le langage de programmation C ANSI et distribué sous licence BSD. Il fait partie de la mouvance NoSQL et vise à fournir les performances les plus élevées possibles.

Source Wikipedia Redis

Redis est très rapide, il est fait pour manipuler des données en mémoire, il peut être utilisé comme serveur de cache ou comme base de données (les données peuvent être persisté sur le disque). C'est un outil pratique pour faire de la performance.

Installer Redis

Je vais installer Redis à l'aide de la distribution Ubuntu 12.04.

J'utilise Vagrant pour les tests (vous pouvez lire l'article "Installer et configurer Vagrant") :

# Initialiser le fichier Vagrantfile pour Ubuntu 12.04
vagrant init ubuntu/precise32
 
# Télécharger Ubuntu 12.04
vagrant up
 
# Se connecter en SSH à Vagrant
vagrant ssh

Pour installer Redis, il faut dans un premier temps le télécharger http://redis.io/download.

Vous pouvez télécharger la version 3.0.0 de Redis (http://download.redis.io/releases/redis-3.0.0.tar.gz), les lignes de commande ci-dessous font le travail pour vous :

# Télécharger la version 3.0.0
wget http://download.redis.io/releases/redis-3.0.0.tar.gz

# Décompresser
tar xvzf redis-3.0.0.tar.gz

# Supprimer l'archive
rm redis-3.0.0.tar.gz

# Aller dans le répertoire décompressé
cd redis-3.0.0/

# Permettre de compiler les sources Redis
sudo apt-get install build-essential

# Compiler Redis
make

Les sources compilées se trouvent dans src/ :

Il faut maintenant configurer Redis :

vi redis.conf

Pour le moment, nous ne changeons pas les paramètres.

Lancer Redis

Démarrons Redis pour la première fois :

# Lancer Redis
./src/redis-server

# Réultat
4597:M 02 May 13:21:43.047 # Server started, Redis version 3.0.0
4597:M 02 May 13:21:43.047 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
4597:M 02 May 13:21:43.047 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4597:M 02 May 13:21:43.047 * The server is now ready to accept connections on port 6379

Comme vous pouvez le constater Redis, vous signale quelques WARNING, il faudra les corriger avant la mise en PRODUCTION (Redis vous explique comment résoudre les différents problèmes).

Puis appuyer sur Ctrl + C pour quitter Redis

Un fichier dump.rdb à été créé. Pour supprimer les données, vous pouvez le supprimer :

rm dump.rdb

Maintenant configurons Redis en mode daemon. Pour cela, il faut éditer le fichier de configuration et modifier remplacer la valeur daemonize no par daemonize yes.

vi redis.conf

Comme ci-dessous :

# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes

Lancer redis-server avec en paramètre le fichier de configutation :

./src/redis-server redis.conf

Redis est maintenant démarré.

Se connecter à Redis

 Pour se connecter à Redis, il faut lancer la commande cli :

./src/redis-cli

# Résultat
127.0.0.1:6379>

Redis se connecte au port par défaut 6379. Nous pouvons maintenant créer des clefs.

# Insérer une clef / valeur
SET clef valeur

# Résultat
OK

# Récupérer la valeur de clef
GET clef

# Résultat
"valeur"

exit pour quitter.

Utiliser les commandes Redis

Vous pouvez voir toutes les commandes cde Redis sur http://redis.io/commands. La documentation des commandes Redis est vraiment bien faite :

171 nosql redis 01

Maintenant, utilisons le client intéractif pour faire des essais de commandes :

./src/redis-cli

# Résultat
127.0.0.1:6379>

Les strings

Commandes : http://redis.io/commands#string

Les caractères spéciaux sont acceptés dans les variables Redis, travaillons maintenant sur des chaines :

# Ajouter la valeur Utilisateur1 de la clef user:1
SET user:1 Utilisateur1

# Récupérer user:1
GET user:1

# Résultat
"Utilisateur1"

Ci-dessous quelques commandes supplémentaires à tester :

# On veut par exemple ajouter la ville de l'utilisateur 1 :
SET user:1:city Paris

# Protéger la chaine
SET user:1:city "New York"

# Afficher user:1
GET user:1

# Ajouter du texte à une clef
APPEND user:1 " TEST"

# Vérifier la longueur
STRLEN user:1

# Sous chaine
GETRANGE user:1 0 11

# Faire un GET et un SET en même temps
GETSET user:1 Utilisateur2

# Remplacer par Test
SETRANGE user:1 0 Test

# Récupérer user:1
GET user:1

# Ajouter un utilisateur
SET user:2 "John Doe"

# Récupérer les valeurs de plusieurs clefs
MGET user:1 user:2

# Ajouter un utilisateur, vérifier si la clef existe
SETNX user:3 "Jean MARTIN"

# Ajouter un utilisateur, vérifier si la clef existe
SETNX user:3 "Jean MARTIN"

Les hashs

Commandes : http://redis.io/commands#hash

Manipulons maintenant des hashs. Un hash est une sorte de dictionnaire (structure clef/valeur) :

# Vérifier la valeur de la clef user:1
GET user:1

# Connaitre le type de la valeur de user:1
TYPE user:1

# Vérifier l'existance d'une clef
EXISTS user:1

# On ne peut pas modifier le type d'une clef existante
HSET user:1 nom Doe

# Renommer user:1 si user.bak:1 n'existe pas
RENAMENX user:1 user.bak:1

# Ajouter un hash
HSET user:1 nom Doe

# Ajouter un hash multiple
HMSET user:1 nom Doe prenom joe

# Afficher toutes les clefs/valeurs
HGETALL user:1

# Vérifier si un champ ou valeur existent
HEXISTS user:1 prenom

# Récupérer le prénom
HGET user:1 prenom

# Connaitre le nombre de clef/valeur dans le hash
HLEN user:1

# Ajouter une clef/valeur
HSET user:1 age 35

# Ajouter si la clef age n'existe pas
HSETNX user:1 age 55

# Récupérer ubniquement le nom et age
HMGET user:1 nom age

# Lister les clefs
HKEYS user:1

# Lister les valeurs
HVALS user:1

Les listes

Commandes : http://redis.io/commands#list

Manipulons maintenant des listes. Une liste est une suite de valeurs ordonnées :

# Pousser des éléments RPUSH (R pour right) ou LPUSH (L pour Left)
RPUSH user:1:log "11:58.6 - Connect" "12:08.1 - Messages"

# Longueur de la liste
LLEN user:1:log

# Récupérer l'élément 0 de la liste
LINDEX user:1:log 0

# Récupérer l'élément 1 de la liste
LINDEX user:1:log 1

# Ajouter une valeur à gauche L
LPUSH user:1:log "11:56.3 - Compte"

# Vérifier la valeur de l'index 0
LINDEX user:1:log 0

# Ajouter un élément si la clef existe
RPUSH user:1:log "13:00.0 - Ajout"

# Quand la liste n'existe pas
RPUSH user:2:log "13:00.0 - Ajout"

# Longueur de la liste
LLEN user:1:log

# Afficher la liste de l'index 0 à 3
LRANGE user:1:log 0 3

# Remplacer la valeur de l'index 0
LSET user:1:log 0 "11:05.5 - Start"

# Retirer le premier élément de la liste
LPOP user:1:log

# Retirer le dernier élément de la liste
RPOP user:1:log

# Si pas d'élément, le process va attendre 2 secondes
BRPOP user:1:log 2

# Créer une liste Liste1
RPUSH Liste1 1 2 3 4 5

# Afficher les valeurs
LRANGE Liste1 0 4

# Récupérer la dernière valeur de Liste1=5 et la mettre dans Liste2
RPOPLPUSH Liste1 Liste2

# Vérifier dans Liste2
LINDEX Liste2 0

Les sets

Commandes : http://redis.io/commands#set

Manipulons maintenant des sets. Les sets répondent à la thérorie des ensembles :

# Créer un user:1
SET user:1 A

# Créer un user:2
SET user:1 B

# Créer un ensemble d'amis de A
SADD user:1:friend 2 85 41 74 26

# Créer un ensemble d'amis de B
SADD user:2:friend 1 35 41 10 20

# Combien de savoir combien il y a d'élément dans un ensemble
SCARD user:1:friend

# Récupérer les éléments
SMEMBERS user:1:friend

# Récupérer un membre aléatoire
SRANDMEMBER user:1:friend

# Plusieurs amis aléatoires, dans notre exemple 3
SRANDMEMBER user:1:friend 3

# Déplacer un amis d'un ensemble à un autre
SMOVE user:1:friend user:2:friend 74

# Connaitre la cardinalité des amis de A et de B
SCARD user:1:friend
SCARD user:2:friend

# Vérifier si ami de A ou de B
SISMEMBER user:1:friend 74
SISMEMBER user:2:friend 74

# Union des amis de A et de B
SUNION user:1:friend user:2:friend

# Interception des amis de A et de B (amis commun)
SINTER user:1:friend user:2:friend

# Différence des amis de A et de B
SDIFF user:1:friend user:2:friend
SDIFF user:2:friend user:1:friend

# Stocker l'union dans s1 des amis de A et de B
SUNIONSTORE s1 user:1:friend user:2:friend
SMEMBERS s1

# Ensemble tirer
DEL user:1:friend
ZADD user:1:friend 0.5 Marc 0.8 Jean 0.2 Pierre

# Connaitre le nombre
ZCARD user:1:friend

# Le nombre d'amis dont le score est compris entre 0 et 0.6
ZCOUNT user:1:friend 0 0.6

# Score de Pierre
ZSCORE user:1:friend Pierre

# Changer le scrore ZINCRBY 0.3 Pierre
ZINCRBY user:1:friend 0.3 Pierre
ZINCRBY user:1:friend -0.5 Pierre

# Connaitre la position par rapport au score
ZRANK user:1:friend Pierre
ZRANK user:1:friend Jean

# Supprimer user:1:friend
DEL user:1:friend

# Créer
ZADD user:1:friend 2 Pierre 2 Paul 2 Jean 2 Bernard

# Connaitre le score de Pierre
ZSCORE user:1:friend Pierre

# Afficher par ordre alphabétique si les score  sont identiques
ZRANGE user:1:friend 0 3

# Trier
ZRANGEBYLEX user:1:friend - +
ZRANGEBYLEX user:1:friend [Paul +
ZRANGEBYLEX user:1:friend (Paul +
ZRANGEBYLEX user:1:friend [Paul [Pierre

Pub-sub

Ouvrir un deuxième terminal et dans le deuxième terminal connectez-vous à redis-cli, puis exécutez les commandes ci-dessous pour utiliser le pattern pub-sub de Redis (Redis est souvent utiliser comme zone d'échange) :

Dans le terminal 1 :

PUBLISH info test1

Dans le terminal 2 :

SUBSCRIBE info

Dans le terminal 1 :

PUBLISH info test1
PUBLISH info test2
PUBLISH info test3

Vérifier le terminal 2, les messages s'affichent :

171 nosql redis 02

Clefs temporaires

Vous pouvez ajouter des clefs temporaires :

SADD cn.19:52.0 15 85 74 95
SADD cn.19:53.6 15 85 74 95

# Supprimer les clefs au bout de 1min par exemple soit 60s
EXPIRE cn.19:52.0 60
EXPIRE cn.19:53.6 60

# Vérifier sa durée de vie à un instant T
TTL cn.19:52.0
TTL cn.19:52.0

# Persister la clef
PERSIST cn.19:52.0

# Vérifier l'expiration
TTL cn.19:52.0

Gérer plusieurs transactions

Les transactions peuvent être mises en file d'attente :

MULTI
LPUSH test test1
LPUSH test test2
LPUSH test test3
LPUSH test test4

# Exécuter en un bloc
EXEC

Réaliser des DUMP

Vous pouvez sauvegarder vos bases en exécutant SAVE :

SAVE

Le problème de SAVE (peut prendre du temps) va bloquer les utilisateurs jusqu'à ce que la commande soit terminée pour rappel, Redis est single thread.

BGSAVE

Va s'exécuter en arrière plan.

Vider complétement la base de données :

FLUSHDB

Afficher les clefs :

KEYS *

Arrêter et sauvegarder les clefs :

SHUTDOWN

Puis exit pour quitter.

Durabilité des données

Si vous souhaitez qu'il n'y est pas de problème de perte de données lors d'un crash de la base de données par exemple, vous pouvez modifier le fichier de configuration :

# Éditer le fichier de configuration
vi redis.conf

# Puis remplacer "appendonly no" par "appendonly yes"

Comme ci-dessous :

# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file
# with the better durability guarantees.
#
# Please check http://redis.io/topics/persistence for more information.

appendonly yes

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

Réplication de données

Si vous souhaitez répliquer vos données :

 # Éditer le fichier de configuration
vi redis.conf

Puis modifier "# slaveof <masterip> <masterport>" par "slaveof 192.168.0.12 6379", modifiez bien entendu l'IP et le port comme vous le souhaitez.

Vous pouvez aussi ajouter un mot de passe en modifiant "# masterauth <master-password>"

Vous pouvez consulter la documentation Redis pour plus d'informations : http://redis.io/topics/replication

Redis Sentinel

Redis Sentinel permet d'assurer le monitoring et le basculement automatique de réplica si le maître est tombé.

Pour que Redis Sentinel fonctionne, il lui faut un fichier de configuration :

# Editez ou  visualiser la configuration de Sentinel
vi sentinel.conf

Pour les différentes configurations, vous pouvez consulter la documentation Redis Sentinel : http://redis.io/topics/sentinel

Démarrer Redis en mode Sentinel :

./src/redis-server sentinel.conf --sentinel

# Résultat
2006:X 03 May 09:48:03.117 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
2006:X 03 May 09:48:03.118 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
2006:X 03 May 09:48:03.118 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
2006:X 03 May 09:48:03.118 # Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now.
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.0.0 (00000000/0) 32 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 2006
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

2006:X 03 May 09:48:03.120 # Sentinel runid is cd6b027055182e3abed54e9666cde08617d837d6
2006:X 03 May 09:48:03.120 # +monitor master mymaster 127.0.0.1 6379 quorum 2

Redis Cluster

Vous pouvez consulter la documentation de Redis Cluster :

Grâce à Redis Cluster, vous pouvez utiliser Redis sur plusieurs serveurs pour faire de la répartition automatique.

Client Redis

Vous pouvez utiliser un client pour différents langages de programmation. Pour cela, vous pouvez consulter la documentation Redis Client : http://redis.io/clients

Conclusion

Ce tutoriel vous a permis de découvrir Redis, qui est une base de données NoSQL clef/valeur super rapide !

Pour plus de compléments, n'hésitez pas d'aller sur le site de Redis http://redis.io/ et de la lire la documentation de Redis http://redis.io/documentation.

Liens

Submit to DeliciousSubmit to DiggSubmit to FacebookSubmit to Google PlusSubmit to StumbleuponSubmit to TechnoratiSubmit to TwitterSubmit to LinkedIn