2016-07-28 1 views
3

Comment implémenter un cache LRU avec Erlang?Erlang LRU Cache

LRU Cache Wiki

Top joué projet Github était fogfish/cache, mais le tableau segmentée était pas tout à fait pour mes données.

barrel-db/erlang-lru utilisait une liste. après le test, il serait lent s'il y avait trop de données.

Je suppose que le problème était ici.

move_front(List, Key) -> [Key | lists:delete(Key, List)].

Avec Java, une meilleure mise en œuvre utilisait un hashmap et un chaînéelike this

J'ai essayé de faire une liste chaînée, puis réalisé que chaînée n'a pas été bonne idée pour Erlang, like this thread. La question est de savoir comment faire un cache LRU avec Erlang?

+0

Je pense que Erlang est le niveau trop élevé pour faire le cache de bas niveau et actuellement, Erlang a des caractéristiques similaires dans le noyau (comme ETS http://erlang.org/doc/man/ets.html), avez-vous testé certaines de ces fonctionnalités avant d'utiliser des projets externes? –

+0

@MathieuK. merci pour vos commentaires. Oui, j'ai essayé. le problème clé est LRU. J'ai essayé d'utiliser une table pour enregistrer l'access_time, mais pour chaque lecture/mise à jour, j'ai besoin de mettre à jour (supprimer puis insérer) la table. Je me demande si cela pourrait être fait dans une meilleure méthode? – user3644708

+0

Je n'ai pas une seule réponse à votre question. Si vous voulez implémenter un cache LRU performant dans Erlang, je pense que l'une des meilleures approches consiste à utiliser du code externe interconnecté avec [ports] (http://erlang.org/doc/reference_manual/ports.html) ou [NIF] (http://erlang.org/doc/tutorial/nif.html). La programmation en C n'est pas mon domaine préféré, mais si vous voulez un exemple d'implémentation du code C pour Erlang, vous pouvez vérifier [code source du faisceau] (https://github.com/erlang/otp/tree/maint/erts/ émulateur/faisceau). –

Répondre

1

La première implémentation de THE CACHE était basée sur ETS avec deux index. Une table ets est tenue TTL -> Key relation, une autre table ets est Key -> Object. Vous pouvez voir la mise en œuvre à

https://github.com/fogfish/cache/commit/8cc50bffb4178ad9ad716703507c3290e1f94821

L'entretien de deux index n'a pas été efficace cache ainsi segmentée surperformer mise en œuvre originale. Je ne recommanderais pas d'implémenter TTL par objet en utilisant des structures de données Erlang, sauf si vous pouvez modéliser vos données dans les acteurs et accepte les frais généraux. Il y a une implémentation pour y remédier. Il est utilise processus par concept d'objet:

https://github.com/fogfish/pts

Sinon, vous devez mettre en œuvre NIF