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

7602f2751868682b296171f58589c851?s=47 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.

7602f2751868682b296171f58589c851?s=128

Grégoire Pineau

September 23, 2020
Tweet

Transcript

  1. Redis Ce n’est pas que pour le Cache Symfony Live

    2020 - Grégoire Pineau - @lyrixx Dev @JoliCode CoreTeam @Symfony
  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, stream, 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 à intervalle 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é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
  10. Dialogue Client - Serveur Protocole très simple et textuel Format

    : COMMAND ARG1 [ARG2] [...] Un nouveau protocol (RESP3) est en WIP
  11. Heu netcat? Non, il y a un CLI officiel

  12. Dialogue Client - Serveur

  13. Des clients PHP ?

  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 disponibles 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 C’est très souvent implémenté par les librairies clientes 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 ◦ RedisInsight... ◦ Redsmin© (SAAS)
  40. RedisInsight

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

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

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

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

    composants l’utilisent ?
  47. Cache

  48. Cache

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

  51. Lock

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

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

    STRING et SORTED SET • Utilise les EXPirations • Utilise du LUA Plus d’informations prochainement... En attendant : https://github.com/symfony/symfony/pull/35780
  54. Messenger

  55. Messenger

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

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

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

    EXPirations
  59. Merci Symfony Live 2020 - Grégoire Pineau - @lyrixx