Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Grégoire Pineau
September 23, 2020

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.

Grégoire Pineau

September 23, 2020
Tweet

More Decks by Grégoire Pineau

Other Decks in Technology

Transcript

  1. Redis Ce n’est pas que pour le Cache Confoo 2023

    Grégoire Pineau @lyrixx Dev @JoliCode - @redirectionio Core-team @Symfony
  2. Redis Open Source (BSD) In-memory data structure store: strings, hashes,

    lists, sets, sorted sets with range queries, stream, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams Replication, Lua scripting, LRU eviction, transactions
  3. 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 à intervalle régulier • AOF : log chaque écriture dans un fichier • On peut combiner RDB & AOF : C’est l’option la plus sécurisante Redis peut être un “primary data store”
  4. 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
  5. La complexité ? O(1) : Constante, peu importe le volume

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

    : COMMAND ARG1 [ARG2] [...] Un nouveau protocol (RESP3) est dispo avec redis 6 en option
  7. Des Data Structures & Des Commandes • Keys • Strings

    • Hashes • Sets • Sorted Sets • Lists • Geo • HyperLogLog • Bitmask • Cluster • Connection • Pub/Sub • Scripting • Server • Streams • Transactions
  8. Strings C’est comme MemCacheD : Clé => Valeur GET /

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

    Compteur : Nombre de visiteurs par jour (INCR / DECR) Gestion de stock : Nombre de produits disponibles Combiné avec les opérations sur les bits : Analytics, BloomFilter Explication simple de l’algo : https://odino.org/bloom-filters-when-data-structures-get-smart/
  10. Hashes Clé => [k1 => v1, k2 => v2, ...

    ] HSET / HGET / HDEL SMSET / HMGET / HGETALL HKEYS HINCRBY
  11. 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
  12. Sets Clé => [Ensemble de valeurs uniques] SADD / SREM

    / SMEMBERS SCARD / SISMEMBER SDIFF / SDIFFSTORE / SINTER / SINTERSTORE SUNION / SUNIONSTORE
  13. 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)
  14. Sorted Sets Clé => [Ensemble de valeurs uniques et triées]

    ZADD / ZREM / ZPOPMIN / ZPOPMAX ZRANGE / ZRANGEBYSCORE ZCARD / ZRANK / ZCOUNT ZINTERSTORE / ZUNIONSTORE
  15. 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
  16. List - Use Cases Une timeline sociale Ne garder que

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

    / GEOHASH GEORADIUS / GEORADIUSBYMEMBER
  18. 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 Explication simple de l’algo : https://odino.org/my-favorite-data-structure-hyperloglog/
  19. 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”
  20. 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
  21. 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 C’est très souvent implémenté par les librairies clientes Mais…
  22. 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
  23. Ops

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

    APT ◦ image docker • Simple à “backuper” • Simple à monitorer ◦ Commandes natives ◦ RedisInsight... ◦ Redsmin© (SAAS)
  25. 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
  26. “Plugins” pour redis Supporté par RedisLabs ou Antirez • RedisTimeSeries

    • RedisML • neural-redis • RediSearch • RedisJSON • RedisBloom • ... Supporté par la communauté • redis-cell (rate limit) • RedisAI • ...
  27. Retour d'expérience ? • Simple • Excessivement rapide ◦ Si

    Redis devient lent, c’est sûrement de notre faute • Beaucoup de data structure qui simplifient le code métier ◦ Plus on découvre de data structures, plus on les utilise • Très bon client en PHP et Go ◦ Permet d’avoir de la configuration partagée entre deux langages ◦ Grâce au pub/sub, c’est immédiat
  28. Cache • Utilise la data structure STRING • Utilise les

    EXPirations • Utilise aussi des SET pour les tags (mais non branché par défaut) • Utilise du LUA
  29. Semaphore • Nouveau composant Symfony • Utilise les data structures

    STRING et SORTED SET • Utilise les EXPirations • Utilise du LUA
  30. Messenger • Utilise intensivement la data structure STREAMS ◦ Garantie

    de non perte de message ◦ Support des acquittements de messages
  31. Next ? Redis 6 (2019-12) • Many new modules APIs.

    • Better expire cycle. • SSL • ACLs • RESP3 • Client side caching • Threaded I/O • Diskless replication on replicas • Redis-benchmark cluster support + Redis-cli improvements • Systemd support rewrite. • Redis Cluster proxy was released with Redis 6 (but different repository). • A Disque module was released with Redis 6 (but different repository). Redis 7 (RC1 le 2022-01-31) • Redis function • Plus d’ACL • Plus d’options de réplication et sauvegarde • Plus de commandes