Redis.
Redis est plus lent que
Memcache
(ça, c’est fait).
Redis est plus gourmand
que Memcache
(de 2 à 10 fois plus).
Redis n’est pas Memcache

Ni un MemcacheDB
Flared
http://labs.gree.jp/Top/OpenSource/Flare-en.html
Elliptics Network
http:...
Getting started
Getting started
 http://code.google.com/    Ne nécessite aucune
 p/redis/                   dépendance
 Licence BSD       ...
Back in time...
Un Memcache avec persistance.
Les snapshots

      Clef 1   Clef 2   Clef 3


       Valeur 1    Valeur 2      Valeur 3
Les snapshots

        Clef 1   Clef 2   Clef 3


        Valeur 1     Valeur 2      Valeur 3



    Disque

    Le fichier...
Les snapshots

      Clef 1   Clef 2   Clef 3


       Valeur 1    Valeur 2      Valeur 3



                  Disque
Les snapshots

 Clef 3’    Clef 1    Clef 2   Clef 3


Valeur 3’   Valeur 1      Valeur 2      Valeur 3

 COW
            ...
Les snapshots

    Redis                    Clef 3’
             Clef 1 Clef 2
    Bgsave                   Clef 3


     ...
Configuration des snapshots

# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys...
Warning!


Il faut disposer de suffisamment de mémoire pour
stocker les copies pendant la sauvegarde.
Au besoin, répartir l...
Append-Only File
Journal des commandes     Pendant l’écriture d’un
qui modifient les          nouveau journal, les
données....
Append-Only File

fsync() après chaque commande, chaque seconde ou
jamais.
On contrôle le moment où l’on souhaite réécrire...
Avantages
Les sauvegardes ne bloquent jamais la lecture ni
l’écriture.
Habituellement, les bases de données ont du mal à
s...
La persistance : pourquoi ?


 Pour pouvoir redémarrer avec un cache qui n’est pas
 vide.
 Pour éventuellement ne pas avoi...
W00t!
Les namespaces

SELECT
MOVE
FLUSHDB
FLUSHALL
Les chaînes
clef (chaîne) -> valeur (chaîne)
2^32-1 clefs d’1 Go max (2^64-1 clefs en interne)
GET / SET / EXISTS
DEL (mul...
Les chaînes
                        SETNX user:1:_lock 1
                                ...
SETNX                     DEL...
O(1)
Les chaînes

KEYS *         RENAME
KEYS pref*     RENAMEMX
KEYS pr[eo]f   EXPIRE
KEYS p?f       EXPIREAT
KEYS p*f       TTL
Redis


RANDOMKEY
Retourne une clef au
hasard
O(1)
MySQL...

SELECT * FROM table ORDER BY RAND() LIMIT 1



           SELECT * FROM table
              WHERE id >=
(SELECT ...
MySQL...
 If there are some holes in the table you can fix it by:

 SELECT (SELECT myTable2.id from myTable myTable2
      ...
MySQL...
To improve performance you can combine this solution
                   with a left join:

SELECT IF(c.id is null...
MySQL...

«The solution to account for gaps produces results
            weighted toward id values
                 that f...
MySQL...

«On ajoute un champ avec des nombres aléatoires et à
  chaque lecture, on permute celui qu’on vient de lire
    ...
TYPE


Retourne le type d’une clef
Le type ??!?!?!
Les types de clefs

 String
 List
 Set
 Zset
 (Hash)
Les listes
 Compactes - 64 Mo            Jusqu’à 2^32-1
 pour une liste d’1 million   éléments par liste.
 d’éléments. N’a...
Les listes
 LPUSH / RPUSH
 LPOP / RPOP
 LLEN
 LINDEX / LRANGE
 LSET (index précis) /
 LREM (élements)
 LTRIM
Les listes
           todo                 processing

  Tâche 1 Tâche 2 Tâche 3


RPOPLPUSH todo processing


           ...
Les listes
           todo                processing

  Tâche 1 Tâche 2           Tâche 3


RPOPLPUSH todo processing   Re...
Les listes
                todo                    processing

    Tâche 1 Tâche 2 Tâche 3


 RPOPLPUSH processing todo


...
Les listes : BLPOP/BRPOP
                  Retourne et efface le
                  dernier élément
                  S’il ...
Les listes : BLPOP/BRPOP

                       Tente d’obtenir un
                       élément de queue1
       BRPOP ...
Les listes : BLPOP/BRPOP


BLPOP : devinez :)
BRPOPPUSH : dans la TODO list pour la v1.4
SORT


Retourne une copie triée des éléments d’une liste, d’un
ensemble ou d’un zset.
Mais pas seulement !
SORT : Warning!

      users = [ joe, robert, john ]

      SORT users
      1. robert
      2. joe
      3. john
SORT
       users = [ joe, robert, john ]

       SORT users ALPHA
       1. joe
       2. john
       3. robert
SORT

       users = [ joe, robert, john ]

  SORT users ALPHA DESC LIMIT 0 2
  1. robert
  2. john
SORT

           users = [ joe, robert, john ]

DEL stcache
SORT users ALPHA DESC LIMIT 0 2 STORE stcache
EXPIRE stcache 3...
SORT


SORT ... BY ... : tri par une autre clef
Hein ?
SORT
                   users = [ 1, 2, 3 ]
SORT users
BY user:*:age      user:1:name frank
                   user:1:age ...
SORT

SORT users
                  user:1:name frank
BY user:*:age
                  user:1:age 30
GET user:*:name
       ...
SORT
SORT users
BY user:*:age
                  user:1:name frank
GET #
                  user:1:age 30
GET user:*:name
  ...
SORT : astuces
Récupère tous les éléments d’une liste, sans tri :
SORT list BY none
Récupère tous les utilisateurs, triés ...
Les ensembles (sets)
Listes d’éléments distincts
Jusqu’à 2^32-1 éléments par ensemble
74 Mo pour une clef avec 1 million d...
Les ensembles (sets)


SADD, SREM, SCARD
SISMEMBER, SMEMBERS
SMOVE
Les ensembles (sets)


SRANDMEMBER
SPOP : déplace de façon atomique un élément
aléatoire dans un autre ensemble.
Les ensembles (sets)
Users
        user:1:name
 1      user:1:age
        user:1:follows   7   3   9   4

 2


 3
Les ensembles : SINTER

                      iphone = [ 1, 5, 8, 10 ]
tags
                      ruby = [ 2, 4, 5, 10 ]

...
Les ensembles : SUNION

                     iphone = [ 1, 5, 8, 10 ]
union des ensembles, ruby = [ 2, 4, 5, 10 ]
mais le ...
Les ensembles (sets)

16/02/2010        1           8        12         23


15/02/2010            2           10         ...
Les ensembles (sets)

        1     3 4       6 7       9 A         C


            2 3       5 6       8 9       B C


  ...
Les ensembles (sets)

SINTERSTORE
SUNIONSTORE
SDIFFSTORE
(évidemment, on peut ajouter une expiration)
Les ensembles (sets)
20h30 : [ 1, 4, 6, 9, 10, 15, 17, 25 ]
20h29 : [ 1, 6, 9, 10, 15, 17, 25 ]
20h28 : [ 4, 6, 9, 10, 13,...
Les ensembles (sets)
20h30 : [ 1, 4, 6, 9, 10, 15, 17, 25 ]
20h29 : [ 1, 6, 9, 10, 15, 17, 25 ]
20h28 : [ 4, 6, 9, 10, 13,...
Les ensembles (sets)
20h30 : [ 1, 4, 6, 9, 10, 15, 17, 25 ]
20h29 : [ 1, 6, 9, 10, 15, 17, 25 ]
20h28 : [ 4, 6, 9, 10, 13,...
Les ensembles triés (Zsets)


 Liste d’éléments uniques
 À chaque élément est associé un «score» (double)
 L’ensemble est ...
Les ensembles triés (Zsets)

           Ensemble users_nb_visits :
               Roberta 2372323
 Roberti
               ...
Les ensembles triés (Zsets)

 ZADD / ZREM : ajoute / retire un élément
 ZCARD : retourne le nombre d’éléments
 ZINCRBY : a...
Les ensembles triés (Zsets)

 ZRANGE 0 -1 : retourne tous les éléments, classés par
 score
 ZRANGE 0 9 : retourne ceux qui...
Les ensembles triés (Zsets)

 ZREVRANGE 0 -1 : retourne tous les éléments, classés
 par scores décroissants
 ZREVRANGE 0 9...
Les ensembles triés (Zsets)
 ZRANGEBYSCORE 2 200000 : retourne tous les
 éléments dont le score est entre 2 et 200000
 ZRA...
Les ensembles triés (Zsets)
 Classements en temps réel, y compris avec des
 millions de données
 Tris avec des critères su...
Les blocs d’opérations
atomiques
(pas tout à fait des transactions, mais presque)
Un bloc atomique :
          MULTI
          DEL clef
          EXPIRE clef 10
          SET clef 42
          GET clef2
 ...
La mémoire virtuelle
Redis 2.0
La mémoire virtuelle


 La RAM, ça va vite
 Les disques (même SSD) beaucoup moins
 L’OS attribue aux applications des page...
La mémoire virtuelle

 Les pages dont on a (à vue de nez) besoin
 immédiatement : l’OS essaye de les placer / déplacer
 en...
La mémoire virtuelle

 La mémoire virtuelle permet aussi aux applications
 d’utiliser une plus grande quantité de mémoire ...
Mais ça raaaaaaaaaaaaame.
La mémoire virtuelle
 L’OS n’a aucune idée de la structure des données
 applicatives
 La taille d’une page mémoire est gén...
La mémoire virtuelle


 On peut écrire les données de façon beaucoup plus
 simple sur disque et surtout beaucoup plus comp...
La mémoire virtuelle

 Espace de stockage divisé en pages, mais la taille des
 pages peut être librement choisie
 Toutes l...
La mémoire virtuelle


 Redis peut être configuré pour conserver les valeurs
 uniquement sur disque : si 1 million de clefs...
La mémoire virtuelle

 Une quantité maximale de RAM à utiliser peut être
 configurée.
 Les valeurs sont transférées sur dis...
Redis dans votre réseau ?
Modèle Redis vs Memcache


Architecture «traditionnelle» : tout est sur disque et on
stocke les lectures les plus récentes...
Modèle Redis vs Memcache
Architecture (hélas) classique : on met à jour une base
SQL, puis on met à jour memcache. Si la b...
Architecture intermédiaire

         Memcache
                              SQL

Client              Worker

          Que...
Architecture intermédiaire

         Memcache
                              SQL

Client              Worker

          Que...
Architecture intermédiaire

         Memcache
                              SQL

Client              Worker

          Que...
Architecture intermédiaire

         Memcache
                              SQL

Client              Worker

          Que...
Architecture intermédiaire

         Memcache
                              SQL

Client              Worker

          Que...
Architecture intermédiaire
         Sécurité (persistance)


                                       SQL

Client           ...
Architecture intermédiaire
         Sécurité (persistance)

                 Redis
                                       ...
Architecture intermédiaire
          sécurité (persistance)

                  Redis
                                     ...
Architecture intermédiaire
          sécurité (persistance)

                  Redis
                                     ...
La réplication
La réplication

 Réplication Master -> Slaves
 Reconfigurable à chaud
 Asynchrone
 EXPIRE transformé en EXPIREAT
 COW comme...
La réplication
 Le slave n’a pas besoin d’avoir des données de départ
 Le master effectue un dump en tâche de fond
 Le sla...
Redis-Cluster
Ce sera pour la version 2.2 !
Redis-Tools
L’offre commerciale
Redis
Load
Redis
 Stat
Redis
 Stat
Redis
 Stat
Redis
 Stat



        + Outils d’exportation en CSV et MySQL

                     Opensource



                 Entre $...
Les clients
Le protocole

Authentification simple (mot de passe)
Protocole binary-safe
Pipelining
TCP uniquement, mais l’attente de la ...
Les bibliothèques clientes
 Actionscript 3   Groovy
 C (Credis)       Haskell
 Clojure          Java
 Common Lisp      LUA...
Les bibliothèques clientes
 Perl           et sûrement d’autres !
 PHP
 Python
 Ruby
 Scala
 TCL
:(
 Sharding uniquement supporté en Ruby (redis-rb), PHP
 (Redisent, Rediska, Predis) et Scala.
 Il est possible de groupe...
Quelques outils...
 Redis-CLI (fourni)   Redis-Textsearch
 RediSH               RRBayes
 RESTMQ               Redis-Admin
...
Hints...

 vm.overcommit_memory=1
 net.ipv4.tcp_tw_reuse=1
 Sous OSX : net.inet.tcp.msl=1000
 NedMalloc
Have fun.
-Frank.
Prochain SlideShare
Chargement dans…5
×

Redis - (nosqlfr meetup #2)

6 337 vues

Publié le

Présentation de la base de données Redis.

Publié dans : Technologie
1 commentaire
17 j’aime
Statistiques
Remarques
  • ZSCORE ne permet de pas de changer le score d'un élément, il permet de le lire
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
Aucun téléchargement
Vues
Nombre de vues
6 337
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1 689
Actions
Partages
0
Téléchargements
147
Commentaires
1
J’aime
17
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive
  • Redis - (nosqlfr meetup #2)

    1. 1. Redis.
    2. 2. Redis est plus lent que Memcache (ça, c’est fait).
    3. 3. Redis est plus gourmand que Memcache (de 2 à 10 fois plus).
    4. 4. Redis n’est pas Memcache Ni un MemcacheDB Flared http://labs.gree.jp/Top/OpenSource/Flare-en.html Elliptics Network http://www.ioremap.net/projects/elliptics
    5. 5. Getting started
    6. 6. Getting started http://code.google.com/ Ne nécessite aucune p/redis/ dépendance Licence BSD Ne nécessite quasiment pas de configuration Fonctionne sur quasiment n’importe Sait se faire tout petit quel système Unix (il (exécutable : 150 ko, existe aussi un début de mémoire : 2 Mo, cpu: portage Windows) 0,00%)
    7. 7. Back in time... Un Memcache avec persistance.
    8. 8. Les snapshots Clef 1 Clef 2 Clef 3 Valeur 1 Valeur 2 Valeur 3
    9. 9. Les snapshots Clef 1 Clef 2 Clef 3 Valeur 1 Valeur 2 Valeur 3 Disque Le fichier est renommé à la fin.
    10. 10. Les snapshots Clef 1 Clef 2 Clef 3 Valeur 1 Valeur 2 Valeur 3 Disque
    11. 11. Les snapshots Clef 3’ Clef 1 Clef 2 Clef 3 Valeur 3’ Valeur 1 Valeur 2 Valeur 3 COW Disque Compression LZF
    12. 12. Les snapshots Redis Clef 3’ Clef 1 Clef 2 Bgsave Clef 3 Important : vm.overcommit_memory=1
    13. 13. Configuration des snapshots # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed save 900 1 save 300 10 save 60 10000
    14. 14. Warning! Il faut disposer de suffisamment de mémoire pour stocker les copies pendant la sauvegarde. Au besoin, répartir les données sur plusieurs instances (et plusieurs disques).
    15. 15. Append-Only File Journal des commandes Pendant l’écriture d’un qui modifient les nouveau journal, les données. écritures continuent à être écrites dans Toute la base peut être l’ancien. reconstruite d’après ce journal. Les commandes manquantes sont BGREWRITEAOF: réécrit concaténées au un journal optimisé. nouveau. Done.
    16. 16. Append-Only File fsync() après chaque commande, chaque seconde ou jamais. On contrôle le moment où l’on souhaite réécrire le journal. Format future-proof et plus résistant aux corruptions que les snapshots.
    17. 17. Avantages Les sauvegardes ne bloquent jamais la lecture ni l’écriture. Habituellement, les bases de données ont du mal à suivre lorsqu’il y a un grand nombre d’écritures. (même les bases nosql, lorsque les données sont persistantes...) Les accès aléatoires ne sont pas bien plus coûteux que les accès séquentiels.
    18. 18. La persistance : pourquoi ? Pour pouvoir redémarrer avec un cache qui n’est pas vide. Pour éventuellement ne pas avoir besoin d’une autre base de données.
    19. 19. W00t!
    20. 20. Les namespaces SELECT MOVE FLUSHDB FLUSHALL
    21. 21. Les chaînes clef (chaîne) -> valeur (chaîne) 2^32-1 clefs d’1 Go max (2^64-1 clefs en interne) GET / SET / EXISTS DEL (multiple, atomique) MGET / MSET (multiple, atomique) INCR / DECR / INCRBY / DECRBY / APPEND
    22. 22. Les chaînes SETNX user:1:_lock 1 ... SETNX DEL user:1:_lock MSETNX MSETNX peuvent se combiner user:1:name -> bob avec EXPIRE pour user:1:zipcode -> 46310 éviter les deadlocks user:1:_lock -> 1 ... DEL user:1:_lock
    23. 23. O(1)
    24. 24. Les chaînes KEYS * RENAME KEYS pref* RENAMEMX KEYS pr[eo]f EXPIRE KEYS p?f EXPIREAT KEYS p*f TTL
    25. 25. Redis RANDOMKEY Retourne une clef au hasard O(1)
    26. 26. MySQL... SELECT * FROM table ORDER BY RAND() LIMIT 1 SELECT * FROM table WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM table) ORDER BY id LIMIT 1;
    27. 27. MySQL... If there are some holes in the table you can fix it by: SELECT (SELECT myTable2.id from myTable myTable2 where myTable2.id>=b.num LIMIT 1) c FROM (SELECT FLOOR(RAND() * (SELECT count(*) FROM myTable)) num ,@num:=@num+1 from (SELECT @num:=0) a , myTable LIMIT X) b ;
    28. 28. MySQL... To improve performance you can combine this solution with a left join: SELECT IF(c.id is null, (SELECT c2.id FROM myTable c2 WHERE c2.id > b.num LIMIT 1), c.id) d FROM (SELECT FLOOR(RAND() * (SELECT count(*) FROM myTable)) num ,@num:=@num+1 FROM (SELECT @num:=0) a , myTable LIMIT X) b LEFT JOIN myTable c ON( c.id=b.num);
    29. 29. MySQL... «The solution to account for gaps produces results weighted toward id values that follow gaps.» Oops!
    30. 30. MySQL... «On ajoute un champ avec des nombres aléatoires et à chaque lecture, on permute celui qu’on vient de lire avec celui d’une autre ligne au hasard !» Wow.
    31. 31. TYPE Retourne le type d’une clef Le type ??!?!?!
    32. 32. Les types de clefs String List Set Zset (Hash)
    33. 33. Les listes Compactes - 64 Mo Jusqu’à 2^32-1 pour une liste d’1 million éléments par liste. d’éléments. N’ayez pas Tout comme les clefs de peur ! type «string», les clefs de Mais moins que du ce type peuvent expirer, JSON / Igbinary / Thrift / être effacées en groupe, Protobuf... renomées et extraites aléatoirement.
    34. 34. Les listes LPUSH / RPUSH LPOP / RPOP LLEN LINDEX / LRANGE LSET (index précis) / LREM (élements) LTRIM
    35. 35. Les listes todo processing Tâche 1 Tâche 2 Tâche 3 RPOPLPUSH todo processing Worker
    36. 36. Les listes todo processing Tâche 1 Tâche 2 Tâche 3 RPOPLPUSH todo processing Retourne Tâche 3 Worker
    37. 37. Les listes todo processing Tâche 1 Tâche 2 Tâche 3 RPOPLPUSH processing todo Nettoyeur (n’oubliez pas le lock !)
    38. 38. Les listes : BLPOP/BRPOP Retourne et efface le dernier élément S’il n’y en a pas, attend (max 10 sec) qu’il y en BRPOP queue 10 ait un Deux clients n’obtiendront jamais le même élément.
    39. 39. Les listes : BLPOP/BRPOP Tente d’obtenir un élément de queue1 BRPOP Sinon, tente dans queue1 queue2 queue3 queue2, puis queue3. 10 Génial pour gérer des listes de tâches avec des priorités
    40. 40. Les listes : BLPOP/BRPOP BLPOP : devinez :) BRPOPPUSH : dans la TODO list pour la v1.4
    41. 41. SORT Retourne une copie triée des éléments d’une liste, d’un ensemble ou d’un zset. Mais pas seulement !
    42. 42. SORT : Warning! users = [ joe, robert, john ] SORT users 1. robert 2. joe 3. john
    43. 43. SORT users = [ joe, robert, john ] SORT users ALPHA 1. joe 2. john 3. robert
    44. 44. SORT users = [ joe, robert, john ] SORT users ALPHA DESC LIMIT 0 2 1. robert 2. john
    45. 45. SORT users = [ joe, robert, john ] DEL stcache SORT users ALPHA DESC LIMIT 0 2 STORE stcache EXPIRE stcache 30 LRANGE stcache 0 50
    46. 46. SORT SORT ... BY ... : tri par une autre clef Hein ?
    47. 47. SORT users = [ 1, 2, 3 ] SORT users BY user:*:age user:1:name frank user:1:age 30 3 user:2:name robert 1 user:2:age 42 2 user:3:name anais user:3:age 3 (si les préfixes sont longs, pensez à à sharedobjects)
    48. 48. SORT SORT users user:1:name frank BY user:*:age user:1:age 30 GET user:*:name user:2:name robert user:2:age 42 anais user:3:name anais frank user:3:age 3 robert
    49. 49. SORT SORT users BY user:*:age user:1:name frank GET # user:1:age 30 GET user:*:name user:2:name robert GET user:*:age user:2:age 42 user:3:name anais 3 anais 3 user:3:age 3 1 frank 30 2 robert 42
    50. 50. SORT : astuces Récupère tous les éléments d’une liste, sans tri : SORT list BY none Récupère tous les utilisateurs, triés par identifiants : SORT users GET # GET user:*:name GET user:*:age Récupère tous les utilisateurs, sans tri : combinez les deux :)
    51. 51. Les ensembles (sets) Listes d’éléments distincts Jusqu’à 2^32-1 éléments par ensemble 74 Mo pour une clef avec 1 million d’éléments «clef primaire» ou «liste des membres de...» L’ordre n’est pas garanti lors d’un SORT BY xyz RANDOMKEY, EXPIRE, RENAME, ...
    52. 52. Les ensembles (sets) SADD, SREM, SCARD SISMEMBER, SMEMBERS SMOVE
    53. 53. Les ensembles (sets) SRANDMEMBER SPOP : déplace de façon atomique un élément aléatoire dans un autre ensemble.
    54. 54. Les ensembles (sets) Users user:1:name 1 user:1:age user:1:follows 7 3 9 4 2 3
    55. 55. Les ensembles : SINTER iphone = [ 1, 5, 8, 10 ] tags ruby = [ 2, 4, 5, 10 ] recherches avec des SINTER iphone ruby critères booléens [ 10, 5 ]
    56. 56. Les ensembles : SUNION iphone = [ 1, 5, 8, 10 ] union des ensembles, ruby = [ 2, 4, 5, 10 ] mais le résultat reste un SET : il ne contient donc que des valeurs SUNION iphone ruby uniques. [ 4, 5, 8, 10, 1, 2 ]
    57. 57. Les ensembles (sets) 16/02/2010 1 8 12 23 15/02/2010 2 10 19 14/02/2010 2 7 11 19 24 SUNION / SINTER : Visiteurs uniques ou qui reviennent d’un jour sur l’autre
    58. 58. Les ensembles (sets) 1 3 4 6 7 9 A C 2 3 5 6 8 9 B C 4 7 B SDIFF 1 A C
    59. 59. Les ensembles (sets) SINTERSTORE SUNIONSTORE SDIFFSTORE (évidemment, on peut ajouter une expiration)
    60. 60. Les ensembles (sets) 20h30 : [ 1, 4, 6, 9, 10, 15, 17, 25 ] 20h29 : [ 1, 6, 9, 10, 15, 17, 25 ] 20h28 : [ 4, 6, 9, 10, 13, 15, 25 ] 20h27 : [ 1, 4, 6, 9, 10, 13, 18, 25 ] 20h26 : [ 1, 4, 6, 9, 10, 18, 20 ] UNION : [ 10, 1, 20, 4, 13, 15, 6, 25, 17, 18, 9 ]
    61. 61. Les ensembles (sets) 20h30 : [ 1, 4, 6, 9, 10, 15, 17, 25 ] 20h29 : [ 1, 6, 9, 10, 15, 17, 25 ] 20h28 : [ 4, 6, 9, 10, 13, 15, 25 ] 20h27 : [ 1, 4, 6, 9, 10, 13, 18, 25 ] 20h26 : [ 1, 4, 6, 9, 10, 18, 20 ] UNION : [ 10, 1, 20, 4, 13, 15, 6, 25, 17, 18, 9 ] amis : [ 13, 15, 27 ] INTER : [ 13, 15 ]
    62. 62. Les ensembles (sets) 20h30 : [ 1, 4, 6, 9, 10, 15, 17, 25 ] 20h29 : [ 1, 6, 9, 10, 15, 17, 25 ] 20h28 : [ 4, 6, 9, 10, 13, 15, 25 ] 20h27 : [ 1, 4, 6, 9, 10, 13, 18, 25 ] 20h26 : [ 1, 4, 6, 9, 10, 18, 20 ] SUNIONSTORE online:new SDIFFSTORE offline online:current online:new RENAME online:new online:current
    63. 63. Les ensembles triés (Zsets) Liste d’éléments uniques À chaque élément est associé un «score» (double) L’ensemble est toujours pré-trié selon le score.
    64. 64. Les ensembles triés (Zsets) Ensemble users_nb_visits : Roberta 2372323 Roberti Roberto 1358912 1332837 Robertu 1301239 Insertion : O(log(N)) Skip lists + hashes
    65. 65. Les ensembles triés (Zsets) ZADD / ZREM : ajoute / retire un élément ZCARD : retourne le nombre d’éléments ZINCRBY : ajoute / retire un nombre au score précédent ZSCORE : change le score d’un élément
    66. 66. Les ensembles triés (Zsets) ZRANGE 0 -1 : retourne tous les éléments, classés par score ZRANGE 0 9 : retourne ceux qui ont les 10 plus petits scores ZRANGE 10 19 : pour la pagination
    67. 67. Les ensembles triés (Zsets) ZREVRANGE 0 -1 : retourne tous les éléments, classés par scores décroissants ZREVRANGE 0 9 : retourne ceux qui ont les 10 meilleurs scores ZREVRANGE 10 19 : pour la pagination
    68. 68. Les ensembles triés (Zsets) ZRANGEBYSCORE 2 200000 : retourne tous les éléments dont le score est entre 2 et 200000 ZRANGEBYSCORE supporte aussi la pagination (LIMIT offset count) et peut retourner les scores en plus des éléments (WITHSCORE) ZCOUNT : compte le nombre d’éléments dont le score est situé dans un intervalle Bornes ouvertes ou fermées : (2 200000 : 2 est exclu.
    69. 69. Les ensembles triés (Zsets) Classements en temps réel, y compris avec des millions de données Tris avec des critères sur mesure Implémentations d’autres structures de données (ex: trie) Bientôt : ZPREV / ZNEXT (x éléments précédant / suivant un élément de référence), ZRANK (rang d’un élément), INTER et UNION.
    70. 70. Les blocs d’opérations atomiques (pas tout à fait des transactions, mais presque)
    71. 71. Un bloc atomique : MULTI DEL clef EXPIRE clef 10 SET clef 42 GET clef2 LPUSH liste element LTRIM liste 0 100 EXEC => [0, 0, "OK", nil, "OK", "OK"]
    72. 72. La mémoire virtuelle Redis 2.0
    73. 73. La mémoire virtuelle La RAM, ça va vite Les disques (même SSD) beaucoup moins L’OS attribue aux applications des pages de mémoire, qui peuvent être de la mémoire physique ou sur disque.
    74. 74. La mémoire virtuelle Les pages dont on a (à vue de nez) besoin immédiatement : l’OS essaye de les placer / déplacer en mémoire physique Les pages dont on n’a (à vue de nez) pas besoin dans l’immédiat : l’OS essaye de les déplacer sur disque Tout espace réellement disponible en RAM peut être utilisé comme cache disque
    75. 75. La mémoire virtuelle La mémoire virtuelle permet aussi aux applications d’utiliser une plus grande quantité de mémoire que la mémoire physique disponible. Pourquoi ne pas s’en servir pour que Redis puisse stocker plus de données que ce que la mémoire peut contenir ? Le pire c’est que... ça fonctionne.
    76. 76. Mais ça raaaaaaaaaaaaame.
    77. 77. La mémoire virtuelle L’OS n’a aucune idée de la structure des données applicatives La taille d’une page mémoire est généralement entre 4 Ko et 16 Ko Dans Redis, une valeur occupe plusieurs blocs de mémoire non consécutifs Les structures de données sont optimisées pour une recherche en RAM
    78. 78. La mémoire virtuelle On peut écrire les données de façon beaucoup plus simple sur disque et surtout beaucoup plus compacte. Moins d’espace de stockage => moins d’I/O Redis a sa propre gestion de la mémoire virtuelle
    79. 79. La mémoire virtuelle Espace de stockage divisé en pages, mais la taille des pages peut être librement choisie Toutes les clefs sont en RAM Les valeurs peuvent être en disque ou en RAM Redis sait toujours quelles clefs sont sur disque, leur taille et leur position exacte.
    80. 80. La mémoire virtuelle Redis peut être configuré pour conserver les valeurs uniquement sur disque : si 1 million de clefs prennent 200 Mo, il n’y aura toujours que 200 Mo d’utilisé quelque soit ce que les clefs contiennent.
    81. 81. La mémoire virtuelle Une quantité maximale de RAM à utiliser peut être configurée. Les valeurs sont transférées sur disque en fonction de leur «swappabilité» : = temps écoulé depuis la dernière utilisation * taille Gestion threadée des copies de/vers le disque.
    82. 82. Redis dans votre réseau ?
    83. 83. Modèle Redis vs Memcache Architecture «traditionnelle» : tout est sur disque et on stocke les lectures les plus récentes dans memcache Redis : un «cache» qui stocke éventuellement les données les moins utiles sur disque
    84. 84. Modèle Redis vs Memcache Architecture (hélas) classique : on met à jour une base SQL, puis on met à jour memcache. Si la base SQL se traîne, tout traîne. Et les incohérences entre les caches et les bases arrivent vite. Redis : on ne met à jour que Redis, qui s’occupe aussi de la durabilité sans bloquer les accès clients, qui s’effectuent en mémoire. Scale en lecture mais aussi en écriture.
    85. 85. Architecture intermédiaire Memcache SQL Client Worker Queue SQL
    86. 86. Architecture intermédiaire Memcache SQL Client Worker Queue SQL
    87. 87. Architecture intermédiaire Memcache SQL Client Worker Queue SQL
    88. 88. Architecture intermédiaire Memcache SQL Client Worker Queue SQL
    89. 89. Architecture intermédiaire Memcache SQL Client Worker Queue SQL
    90. 90. Architecture intermédiaire Sécurité (persistance) SQL Client Worker Queue SQL
    91. 91. Architecture intermédiaire Sécurité (persistance) Redis SQL Client Worker Queue SQL
    92. 92. Architecture intermédiaire sécurité (persistance) Redis SQL Client Worker SQL sets (éléments uniques)
    93. 93. Architecture intermédiaire sécurité (persistance) Redis SQL Client Worker Redis SQL sets (éléments uniques)
    94. 94. La réplication
    95. 95. La réplication Réplication Master -> Slaves Reconfigurable à chaud Asynchrone EXPIRE transformé en EXPIREAT COW comme pour les snapshots
    96. 96. La réplication Le slave n’a pas besoin d’avoir des données de départ Le master effectue un dump en tâche de fond Le slave attend la fin du dump puis le charge Le master transmet au slave la liste des modifications effectuées pendant le dump ainsi que les modifications suivantes La réplication ne bloque jamais le master
    97. 97. Redis-Cluster Ce sera pour la version 2.2 !
    98. 98. Redis-Tools L’offre commerciale
    99. 99. Redis Load
    100. 100. Redis Stat
    101. 101. Redis Stat
    102. 102. Redis Stat
    103. 103. Redis Stat + Outils d’exportation en CSV et MySQL Opensource Entre $ 200 et $ 350
    104. 104. Les clients
    105. 105. Le protocole Authentification simple (mot de passe) Protocole binary-safe Pipelining TCP uniquement, mais l’attente de la réponse du serveur n’est pas obligatoire. L’UDP est dans la TODO-list.
    106. 106. Les bibliothèques clientes Actionscript 3 Groovy C (Credis) Haskell Clojure Java Common Lisp LUA Erlang .NET Go NodeJS
    107. 107. Les bibliothèques clientes Perl et sûrement d’autres ! PHP Python Ruby Scala TCL
    108. 108. :( Sharding uniquement supporté en Ruby (redis-rb), PHP (Redisent, Rediska, Predis) et Scala. Il est possible de grouper des clefs sur un shard en respectant certaines conventions pour le nom de ces clefs. Ce n’est que du sharding, il n’y a aucune redondance ni reconfiguration. Pas de Spymemcached ni de Moxi.
    109. 109. Quelques outils... Redis-CLI (fourni) Redis-Textsearch RediSH RRBayes RESTMQ Redis-Admin Resque Redweb Celery Retwis-Rb Torque Redis Ajax Chat
    110. 110. Hints... vm.overcommit_memory=1 net.ipv4.tcp_tw_reuse=1 Sous OSX : net.inet.tcp.msl=1000 NedMalloc
    111. 111. Have fun. -Frank.

    ×