$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

  2. Qui connait Redis ?

    View Slide

  3. Pour faire autre chose que du
    cache ?

    View Slide

  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

    View Slide

  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
    Redis peut être un “primary data store”

    View Slide

  6. Documentation / Intégration
    https:/
    /redis.io

    View Slide

  7. View Slide

  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

    View Slide

  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 😨

    View Slide

  10. Dialogue Client - Serveur
    Protocole très simple et textuel
    Format : COMMAND ARG1 [ARG2] [...]
    Un nouveau protocol (RESP3) est dispo avec redis 6 en option

    View Slide

  11. Heu netcat? Non, il y a un CLI officiel

    View Slide

  12. Dialogue Client - Serveur

    View Slide

  13. Des clients PHP ?
    Plus 9 autres implémentations (soit une de plus qu’en JS 😬)

    View Slide

  14. Des Data Structures & Des Commandes
    ● Keys
    ● Strings
    ● Hashes
    ● Sets
    ● Sorted Sets
    ● Lists
    ● Geo
    ● HyperLogLog
    ● Bitmask
    ● Cluster
    ● Connection
    ● Pub/Sub
    ● Scripting
    ● Server
    ● Streams
    ● Transactions

    View Slide

  15. Des Data Structures

    View Slide

  16. Des clés
    KEYS / EXISTS
    RENAME / DEL
    EXPIRE / TTL / TOUCH
    TYPE / DUMP

    View Slide

  17. Strings
    C’est comme MemCacheD : Clé => Valeur
    GET / SET / GETSET
    MGET / MSET
    INCR / DESC
    BITCOUNT / BITFIELD / BITOP / BITPOS
    ...

    View Slide

  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
    Explication simple de l’algo :
    https://odino.org/bloom-filters-when-data-structures-get-smart/

    View Slide

  19. Hashes
    Clé => [k1 => v1, k2 => v2, ... ]
    HSET / HGET / HDEL
    SMSET / HMGET / HGETALL
    HKEYS
    HINCRBY

    View Slide

  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

    View Slide

  21. Sets
    Clé => [Ensemble de valeurs uniques]
    SADD / SREM / SMEMBERS
    SCARD / SISMEMBER
    SDIFF / SDIFFSTORE / SINTER / SINTERSTORE
    SUNION / SUNIONSTORE

    View Slide

  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)

    View Slide

  23. Sorted Sets
    Clé => [Ensemble de valeurs uniques et triées]
    ZADD / ZREM / ZPOPMIN / ZPOPMAX
    ZRANGE / ZRANGEBYSCORE
    ZCARD / ZRANK / ZCOUNT
    ZINTERSTORE / ZUNIONSTORE

    View Slide

  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

    View Slide

  25. Lists
    Key => [Liste chaînée]
    LPUSH / LPOP
    LRANGE
    LTRIM
    RPUSH / RPOP

    View Slide

  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 ⚠

    View Slide

  27. Geo
    Key => [Positions en liste triée]
    GEOADD
    GEODIST
    GEOPOS / GEOHASH
    GEORADIUS / GEORADIUSBYMEMBER

    View Slide

  28. Geo - Use Cases
    Calculer des distances
    Trouver les points les plus proches

    View Slide

  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
    Explication simple de l’algo :
    https://odino.org/my-favorite-data-structure-hyperloglog/

    View Slide

  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”

    View Slide

  31. Des commandes

    View Slide

  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

    View Slide

  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…

    View Slide

  34. Transactions
    Permet d'exécuter plusieurs commandes de manière atomique. Mais…

    View Slide

  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

    View Slide

  36. Scripting ❤❤❤❤❤

    View Slide

  37. Scripting ❤❤❤❤❤

    View Slide

  38. View Slide

  39. Ops

    View Slide

  40. Point de vue ops
    ● Simple à installer
    ○ paquet APT
    ○ image docker
    ● Simple à “backuper”
    ● Simple à monitorer
    ○ Commandes natives
    ○ RedisInsight...
    ○ Redsmin© (SAAS)

    View Slide

  41. RedisInsight

    View Slide

  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

    View Slide

  43. Redis Modules

    View Slide

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

    View Slide

  45. Retour d'expérience ?

    View Slide

  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

    View Slide

  47. Et Redis dans Symfony ?
    A votre avis, combien de composants l’utilisent ?

    View Slide

  48. Cache

    View Slide

  49. Cache

    View Slide

  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

    View Slide

  51. Lock

    View Slide

  52. Lock

    View Slide

  53. Lock
    ● Utilise la data structure STRING
    ● Utilise les EXPirations
    ● Utilise du LUA

    View Slide

  54. Semaphore
    ● Nouveau composant Symfony
    ● Utilise les data structures STRING et SORTED SET
    ● Utilise les EXPirations
    ● Utilise du LUA

    View Slide

  55. Messenger

    View Slide

  56. Messenger

    View Slide

  57. Messenger
    ● Utilise intensivement la data structure STREAMS
    ○ Garantie de non perte de message
    ○ Support des acquittements de messages

    View Slide

  58. Session
    Avec php-redis Nativement à Symfony

    View Slide

  59. Session
    ● Utilise la data structure STRING
    ● Utilise les EXPirations

    View Slide

  60. Merci
    Confoo 2023
    Grégoire Pineau
    @lyrixx
    Dev @JoliCode - @redirectionio
    Core-team @Symfony

    View Slide

  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

    View Slide