2009-10-19 8 views
1

J'ai un serveur web qui crée dynamiquement différents rapports dans plusieurs formats (fichiers pdf et doc). Les fichiers nécessitent une bonne quantité de CPU à générer, et il est assez fréquent d'avoir des situations où deux personnes créent le même rapport avec la même entrée.Système de cache pour les fichiers créés dynamiquement?

Entrées:

  • entrée de données brutes sous forme de chaîne (équations, des chiffres et listes de mots), longueur arbitraire, près de 99% sera inférieur à environ 200 mots
  • la version du outil de création de rapport

Lorsqu'un utilisateur tente de générer un rapport, je voudrais vérifier si un fichier existe déjà avec l'entrée donnée et, si c'est le cas, renvoyer un lien vers le fichier. Si le fichier n'existe pas, je voudrais le générer au besoin.

  1. Quelles solutions existent déjà? J'ai déjà mis en cache des requêtes http simples, mais les clés étaient extrêmement simples (en général, les ID de base de données)

  2. Si je dois le faire moi-même, quel est le meilleur moyen. L'entrée peut être de plusieurs centaines de mots, et je me demandais comment je devrais transformer les chaînes en clés envoyées au cache.

    // entrée entière, utilise trop de mémoire, un à un mappage cache [ « un deux trois quatre cinq six sept huit neuf dix onze ... »] // clés courtes cache [ « un deux » ] => 5 résultats, alors je dois plisse ces bas encore plus

  3. est-ce quelque chose qui devrait être fait dans une base de données, ou est-il mieux fait dans le code de l'application Web (python dans mon cas)

Merci à vous tous.

+0

Quel framework web utilisez-vous? Certains cadres ont des fonctionnalités de mise en cache intégrées. – nosklo

Répondre

2

C'est ce à quoi sert Apache.

Créez un répertoire contenant les rapports.

Configurez Apache pour servir les fichiers de ce répertoire. Si le rapport existe, rediriger vers une URL qu'Apache desservira.

Sinon, le rapport n'existe pas, créez-le. Puis redirigez vers une URL qu'Apache utilisera.


Il n'y a pas de "hachage". Vous avez une clé ("une chaîne (équations, nombres et listes de mots), longueur arbitraire, près de 99% sera inférieure à environ 200 mots") et une valeur, qui est un fichier. Ne perdez pas de temps sur un hachage. Vous avez juste une longue clé.

Vous pouvez compresser cette clé en en faisant un "slug": supprimez la ponctuation, remplacez les espaces par _, ce genre de chose.

Vous devez créer une clé de substitution interne qui est un entier simple.

Vous traduisez simplement une longue clé à un "rapport" qui existe sous la forme d'un fichier ou qui sera créé en tant que fichier.

+0

Comment recommanderiez-vous de mapper la chaîne d'entrée au fichier, cependant? Hashing aura trop de collisions pour les petites chaînes, n'est-ce pas? –

+0

@ Bill, pensez à utiliser SHA256 ou autre chose pour le hachage, calculez le coût en dégâts/$$ est multiplié par la probabilité d'une collision. Si le chiffre obtenu n'est pas assez petit, utilisez un hash plus grand. rincer répéter. Parfois, vous ne pouvez pas vivre avec une collision de hachage - par exemple des données médicales ou autres. Ne dépendez jamais d'un a dans ce cas –

1

La chose habituelle est d'utiliser un proxy inverse comme Squid ou Varnish

Questions connexes