Table des matières


Créé le: 2024-04-07 ; Révisé le: 2024-04-07

Développons avec Simon - 7 - Créer une implémentation de Spring Cache pour MongoDB

Vidéo (1 heure 12 minutes)

Introduction (00:00:00)

À quoi sert le caching (00:00:35)

  • Ordinateur 1:
    • Processus 1
      • Fil (thread) 1
      • Fil (thread) 2
      • Fil (thread) … 100
    • Processus 2
      • Fil (thread) 1
      • Fil (thread) 2
      • Fil (thread) … 100
  • Ordinateur 2:
    • Processus 1
      • Fil (thread) 1
      • Fil (thread) 2
      • Fil (thread) … 100

Les classes distribuées utilisant MongoDB que je peux utiliser (00:10:03)

Toutes les classes sont dans https://github.com/foilen/java-libraries/tree/master/jl-smalltools/jl-smalltools-mongodb/src/main/java/com/foilen/smalltools/mongodb/distributed .

  • MongoDbDeque: Une BlockingDeque<V> qui stocke les valeurs dans une collection MongoDB
    • C’est surtout utilisé comme une file d’attente pour distribuer des tâches. Pas nécessaire pour le caching.
  • MongoDbReentrantLock: Un système de verrouillage distribué basé sur MongoDB
    • C’est utilisé pour s’assurer qu’une seule instance d’une application génère une valeur manquante.
  • MongoDbSortedMapStringObject: Une SortedMap<String, V> qui prend du texte comme clé et stocke les valeurs dans une collection MongoDB

Design du caching (00:20:55)

  • Spring Cache Manage
    • Cache: MongoDbSortedMapStringObject
      • Nombre max de valeurs: Capped Collection (taille, nombre de documents)
      • Expiration automatique: Ttl index
      • MongoDbReentrantLock pour un seul fil obtient la valeur quand elle est manquante
  • Tests unitaires

Implémentation (en partie) (00:27:46)

  • MongoDbCacheManager qui implémente CacheManager (de Spring)
  • MongoDbCache qui implémente Cache (de Spring)
  • Quelques méthodes sont implémentées, mais pas l’entièreté étant donné que cela prendra plusieurs heures.

Ces nouvelles classes sont dans https://github.com/foilen/java-libraries/tree/master/jl-smalltools/jl-smalltools-mongodb-spring/src/main/java/com/foilen/smalltools/mongodb/spring/cache .

Mot de la fin (01:10:37)

Extra après la vidéo

  • Initialement, j’ai mis MongoDbCacheManager<V> (donc avec un type générique), mais j’ai dû changer pour MongoDbCacheManager (sans type générique) parce que comme expliqué durant la vidéo, un cache Manager va avoir plusieurs Cache pour différents cas d’utilisation et donc pour différents types.
    • Je vais donc avoir une nouvelle classe qui sera une entrée dans le cache et qui aura la valeur en json ainsi que le nom du type.
    • Quand on va appeler get(key), cela va désérialiser selon le type dans l’entrée.
  • Pour le maximum en taille et maximum en temps, je comptais utiliser une collection avec un “cap” et un index TTL, mais c’est explicitement incompatible: