3 votes

Vitesse de consultation des tableaux en PHP ; clés de cache longues

Je travaille sur une méthode qui, en raison du coût de son fonctionnement et de la fréquence à laquelle elle est appelée avec des arguments identiques, bénéficierait de la mise en cache des valeurs de retour.

Je serai serialize() -en regroupant les arguments pour les clés de cache, mais cela peut donner des clés très longues, en raison de la longueur des arguments du tableau.

  • Est-ce que l'indexation et la consultation des tableaux en PHP souffrent de clés aussi longues ( pensez de 250B à 1kB+ ) ?
  • Jusqu'ici tout va bien, mais est-ce que je suis dans une situation où cela pourrait échouer de façon spectaculaire à un moment donné ?
  • En gros, est-ce que je dois md5() ( ou alternative ) les clés ?

Clarifications mineures :
Il s'agit uniquement d'une mise en cache par requête, sans stockage permanent. La méthode en question est celle d'une aide de vue, et pour chaque génération de vue, elle peut être appelée 500 fois ou plus.

4voto

fyr Points 7756

Vous devriez définitivement hacher la clé. Vous diriez peut-être "Pourquoi devrais-je risquer d'obtenir des collisions alors que je peux concaténer à chaque instant une clé unique ?". La réponse facile est que si vous générez des clés de cache via la concaténation de chaînes de caractères, vous devez toujours calculer le pire cas des exigences d'espace pour estimer l'utilisation de la RAM.

Donc, si vous avez un cache avec 200 entrées et 2 champs avec des chaînes de 20 caractères maximum. Le pire cas serait 200*2*20*(size of character) . Si vous chargez le cache complet sur chaque connexion parallèle possible, le nombre de connexions parallèles sera multiplié par le nombre de connexions parallèles.

Avec les hachages, vous avez toujours l'exigence de ram minimum = ram maximum pour le champ clé.

Si vous avez beaucoup de valeurs qui sont concaténées pour les clés, l'échelle sera très mauvaise.

Edit :

Même si vous l'utilisez par requête, le tableau consomme de la mémoire. Bien que ce soit un cache, il est présent du début à la fin de la requête. Vous devez donc prendre en compte le fait qu'il consomme une certaine quantité d'espace dans votre mémoire, alors qu'en utilisant un hash, il s'agit d'une quantité fixe.

La deuxième chose est que les clés doivent être comparées. Si vous accédez à un tableau associatif avec une clé de type chaîne de caractères, votre interpréteur doit comparer la clé par caractères. Si vous disposez d'une méthode de hachage pour générer les clés, cela représente également un nombre fixe d'étapes.

Si vous utilisez la concaténation, le nombre d'étapes variera entre le meilleur et le pire des cas.

1voto

46Bit Points 951

Il n'est certainement pas typique d'avoir des clés de tableau aussi longues, mais il faudrait probablement faire des tests comparatifs pour évaluer le ralentissement réel. En cas de doute, il suffit de faire un md5 - d'après ce que vous dites, l'accélération sera tellement importante par rapport au temps de md5 que ce dernier sera insignifiant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X