Redis - Ce n’est pas que pour le Cache - V2

Redis - Ce n’est pas que pour le Cache - V2

Redis sait faire bien plus que stocker des valeurs sous forme de Strings. Grâce à des structures de données évoluées et à ses performances hors du commun, il devient un allié très puissant à ajouter dans sa stack préférée.

Des statistiques à la persistance de session en passant par les leaders board ou la gestion de coordonnées, vous ne verrez plus ce SGBD du même œil !

A travers une série d'exemples, des trucs & astuces, nous verrons comment utiliser Redis depuis une application PHP.

7602f2751868682b296171f58589c851?s=128

Grégoire Pineau

October 24, 2019
Tweet

Transcript

  1. Redis - Ce n’est pas que pour le Cache AFUP

    Paris 2019 - Grégoire Pineau - @lyrixx Dev @JoliCode CoreTeam @Symfony NEW
  2. Qui connait Redis ?

  3. Pour faire autre chose que du cache ?

  4. Redis Open Source (BSD) In-memory data structure store: strings, hashes,

    lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams Replication, Lua scripting, LRU eviction, transactions
  5. Différent stockage Par défaut Redis est “in-memory” Mais on peut

    persister les données sur le disque : • RDB : snapshot des données à interval régulier • AOF : log chaque écriture dans un fichier • On peut combiner RDB & AOF : C’est l’option la plus sécurisante
  6. Documentation / Intégration https://redis.io

  7. None
  8. La complexité ? Quantité de ressources (par exemple en temps

    CPU ou en RAM) nécessaire à l'exécution d’un algorithme Pour Redis, c’est en CPU Plus la complexité est faible, mieux c’est
  9. La complexité ? O(1) : Constante, peu importe le volume

    de donnée 0(log(n)) : C’est très rapide O(n) : Linéaire, fonction linéaire suivant le volume de donnée ❤ O(n2) : Quadratique, ca explose très vite O(n!) Factorielle ou O(x^n) Expo : On oublie
  10. Dialogue Client - Serveur Protocole très simple et textuel Format

    : COMMAND ARG1 [ARG2] [...] Et il existe beaucoup de clients :
  11. Heu netcat? Non, il y a un CLI officiel

  12. Des clients PHP ? Plus 9 autres implémentations (soit une

    de plus qu’en JS )
  13. None
  14. Des Data Structures & Des Commandes • Keys • Strings

    • Hashes • Sets • Sorted Sets • Lists • Geo • HyperLogLog • Bitmask • Cluster • Connection • Pub/Sub • Scripting • Server • Streams • Transactions
  15. Des Data Structures

  16. Des clés KEYS / EXISTS RENAME / DEL EXPIRE /

    TTL / TOUCH TYPE / DUMP
  17. Strings C’est comme MemCacheD : Clé => Valeur GET /

    SET / GETSET MGET / MSET INCR / DESC BITCOUNT / BITFIELD / BITOP / BITPOS ...
  18. Strings - Use Cases Cache : L’utilisation la plus connue

    Compteur : Nombre de visiteurs par jour (INCR / DECR) Gestion de stock : nombre de produits disponible Combiné avec les opérations sur les bits : Analytics, BloomFilter
  19. Hashes Clé => [k1 => v1, k2 => v2, ...

    ] HSET / HGET / HDEL SMSET / HMGET / HGETALL HKEYS HINCRBY
  20. Hashes - Use Case Évite de stocker du JSON dans

    une valeur de type string : • C’est plus performant • Évite les races conditions Dénormalisation de données structurées Stockage de configuration
  21. Sets Clé => [Ensemble de valeurs uniques] SADD / SREM

    / SMEMBERS SCARD / SISMEMBER SDIFF / SDIFFSTORE / SINTER / SINTERSTORE SUNION / SUNIONSTORE
  22. Sets - Use Cases Tracking d’utilisateurs Travail sur les ensembles

    ( Union / Diff / Merge ) : • Segmentation d’une population (qui a voyagé le mois dernier, depuis Paris, …) • Système de tags (vidéos de chat + skate board + Madrid)
  23. Sorted Sets Clé => [Ensemble de valeurs uniques et triées]

    ZADD / ZREM / ZPOPMIN / ZPOPMAX ZRANGE / ZRANGEBYSCORE ZCARD / ZRANK / ZCOUNT ZINTERSTORE / ZUNIONSTORE
  24. Sorted Sets - Use Case Leaderboard (jeux / QA): •

    Quelle est ma place ? • Quels sont les autres joueurs autour de ma place ? • Qui sont les meilleurs ? Création d’index • Liste des villes avec plus de 1000 habitants • Liste des pays avec un PIB entre 1000 et 1500 Scheduler
  25. Lists Key => [Liste chaînée] LPUSH / LPOP LRANGE LTRIM

    RPUSH / RPOP
  26. List - Use Cases Une timeline sociale Ne garder que

    les N derniers événements / éléments Flux RSS Un système de queue passive
  27. Geo Key => [Positions en liste triée] GEOADD GEODIST GEOPOS

    / GEOHASH GEORADIUS / GEORADIUSBYMEMBER
  28. Geo - Use Cases Calculer des distances Trouver les points

    les plus proches
  29. HyperLogLogs Extension de Strings HyperLogLog est un algo pour compter

    la cardinalité d’un très grand ensemble de manière probabiliste avec très peu de mémoire (12Kb) PFADD PFCOUNT
  30. Stream Depuis Redis 5.x (2018) Log data structure (append only

    - enfin presque) Ressemble aux listes, mais avec plus d’opérations Groupes de consumers - ça ressemble à Kafka Acquittements des “messages”
  31. Des commandes

  32. Pub / Sub Système de Publisher / Subscriber Bien pour

    faire de l’asynchrone, mais ... Pas de notion d'acquittement de messages L’utilisation des streams est plus appropriée Je préfère RabbitMQ pour faire ça … Cependant ça peut être utile si on peut perdre des messages
  33. Pipeline Permet d'exécuter plusieurs commandes à la suite Évite plusieurs

    allers / retours entre le client et le serveur Exemple : (printf "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379 Mais…
  34. Transactions Permet d'exécuter plusieurs commandes de manière atomique Mais…

  35. Scripting ❤❤❤❤❤ Permet de faire du LUA dans Redis Permet

    d’appeler toutes les commandes de Redis Permet de chaîner les commandes Évite les allers / retours entre le client et le serveur L'exécution d’un script est atomique
  36. Scripting ❤❤❤❤❤

  37. Scripting ❤❤❤❤❤

  38. Ops

  39. Point de vue ops • Simple à installer ◦ paquet

    APT ◦ image docker • Simple à “backuper” • Simple à monitorer ◦ Commandes natives ◦ Redsmin© (SAAS) ◦ ...
  40. Cluster / Réplication / HA Si le DataSet ne tient

    pas en RAM => Redis Cluster Le cluster va faire automatiquement du sharding sur les clés Si le DataSet tient en RAM mais qu’on veut de la haute disponibilité => Redis Sentinel
  41. Redis Modules

  42. “Plugins” pour redis Supporté par RedisLabs ou Antirez • RedisTimeSeries

    • RedisML • neural-redis • RediSearch • RedisJSON • RedisBloom • ... Supporté par la communauté • redis-cell (rate limit) • RedisAI • ...
  43. Un vrai use case ?

  44. None
  45. Résultats

  46. Mais en vrai ? Lors d’un crawl, il y a

    plusieurs clés : • crawlable • tmp-XXXX • running • crawled Quand une page est crawlée : 1. On extrait tous les liens 2. On les ajoute dans tmp-XXX 3. On fait un diff avec les URLs dans crawlable 4. On limite éventuellement le nombre d’URLs 5. On ajoute ces URLs dans Crawlable 6. On retourne ces URLs Les étapes 2 à 6 sont en LUA, atomiques, très rapides
  47. Ça va vite ?

  48. Merci AFUP Paris 2019 - Grégoire Pineau - @lyrixx