LRUCache à Scala?

Je sais que Guava a une excellente bibliothèque de mise en cache, mais je cherche quelque chose de plus convivial pour Scala / fonctionnal où je peux faire des choses comme cache.getOrElse(query, { /* expensive operation */}) . J’ai aussi regardé le mémo de Scalaz mais cela n’a pas d’expiration limitée.

Les gens de Spray ont un module de mise en cache de spray qui utilise Futures. Il existe une version simple de LRU et une version qui vous permet de spécifier une durée de vie explicite, après quoi les entrées sont automatiquement expirées.

L’utilisation de Futures vous permet évidemment d’écrire du code qui ne bloque pas. Ce qui est vraiment cool, cependant, est que cela résout le problème des “troupeaux tonitruants” en prime. Supposons, par exemple, qu’une série de demandes arrivent en même temps pour la même entrée qui ne se trouve pas dans le cache. Dans une implémentation de cache naïve, une centaine de threads risquent de manquer une entrée dans le cache, puis de s’exécuter pour générer les mêmes données pour cette entrée de cache, mais bien sûr, 99% de cet effort est un effort inutile. Ce que vous voulez vraiment, c’est qu’un seul thread produise les données et que tous les 100 demandeurs voient le résultat. Cela se produit assez naturellement si votre cache contient des contrats à terme: le premier demandeur installe immédiatement un futur dans le cache, de sorte que seul le premier demandeur manque. Les 100 demandeurs reçoivent tous cet avenir pour le résultat généré.

J’ai trouvé exactement ce que je cherchais dans la bibliothèque Scala Util de Twitter