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

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

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 SnowCamp 2022

    - Grégoire Pineau - @lyrixx Dev @JoliCode Core-team @Symfony
  2. 2022 Merci à nos sponsors « Etoile » « Flocon

    »
  3. Qui connait Redis ?

  4. Pour faire autre chose que du cache ?

  5. 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
  6. 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”
  7. Documentation / Intégration https:/ /redis.io

  8. None
  9. 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
  10. 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 😨
  11. Dialogue Client - Serveur Protocole très simple et textuel Format

    : COMMAND ARG1 [ARG2] [...] Un nouveau protocol (RESP3) est dispo avec redis 6 en option
  12. Heu netcat? Non, il y a un CLI officiel

  13. Dialogue Client - Serveur

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

    de plus qu’en JS 😬)
  15. Des Data Structures & Des Commandes • Keys • Strings

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

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

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

    SET / GETSET MGET / MSET INCR / DESC BITCOUNT / BITFIELD / BITOP / BITPOS ...
  19. 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/
  20. Hashes Clé => [k1 => v1, k2 => v2, ...

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

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

    ZADD / ZREM / ZPOPMIN / ZPOPMAX ZRANGE / ZRANGEBYSCORE ZCARD / ZRANK / ZCOUNT ZINTERSTORE / ZUNIONSTORE
  25. 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
  26. Lists Key => [Liste chaînée] LPUSH / LPOP LRANGE LTRIM

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

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

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

    les plus proches
  30. 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/
  31. 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”
  32. Des commandes

  33. 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
  34. 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…
  35. Transactions Permet d'exécuter plusieurs commandes de manière atomique. Mais…

  36. 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
  37. Scripting ❤❤❤❤❤

  38. Scripting ❤❤❤❤❤

  39. Ops

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

    APT ◦ image docker • Simple à “backuper” • Simple à monitorer ◦ Commandes natives ◦ RedisInsight... ◦ Redsmin© (SAAS)
  41. RedisInsight

  42. 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
  43. Redis Modules

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

    • RedisML • neural-redis • RediSearch • RedisJSON • RedisBloom • ... Supporté par la communauté • redis-cell (rate limit) • RedisAI • ...
  45. Retour d'expérience ?

  46. 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
  47. Et Redis dans Symfony ? A votre avis, combien de

    composants l’utilisent ?
  48. Cache

  49. Cache

  50. 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
  51. Lock

  52. Lock

  53. Lock • Utilise la data structure STRING • Utilise les

    EXPirations • Utilise du LUA
  54. Semaphore • Nouveau composant Symfony • Utilise les data structures

    STRING et SORTED SET • Utilise les EXPirations • Utilise du LUA
  55. Messenger

  56. Messenger

  57. Messenger • Utilise intensivement la data structure STREAMS ◦ Garantie

    de non perte de message ◦ Support des acquittements de messages
  58. Session Avec php-redis Nativement à Symfony

  59. Session • Utilise la data structure STRING • Utilise les

    EXPirations
  60. Merci Snow Camp 2022 - Grégoire Pineau - @lyrixx

  61. 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