Redis
 sql >> Base de données >  >> NoSQL >> Redis

Performances de Redis vs Disk dans l'application de mise en cache

Il s'agit d'une comparaison de pommes et d'oranges. Voir http://redis.io/topics/benchmarks

Redis est une télécommande efficace magasin de données. A chaque fois qu'une commande est exécutée sur Redis, un message est envoyé au serveur Redis, et si le client est synchrone, il bloque l'attente de la réponse. Ainsi, au-delà du coût de la commande elle-même, vous paierez un aller-retour réseau ou un IPC.

Sur le matériel moderne, les allers-retours réseau ou IPC sont étonnamment coûteux par rapport à d'autres opérations. Cela est dû à plusieurs facteurs :

  • la latence brute du support (principalement pour le réseau)
  • la latence du planificateur du système d'exploitation (non garantie sous Linux/Unix)
  • les échecs de cache mémoire sont coûteux, et la probabilité d'échecs de cache augmente pendant que les processus client et serveur sont programmés en entrée/sortie.
  • sur les boîtiers haut de gamme, les effets secondaires du NUMA

Passons maintenant en revue les résultats.

En comparant l'implémentation utilisant des générateurs et celle utilisant des appels de fonction, elles ne génèrent pas le même nombre d'allers-retours vers Redis. Avec le générateur vous avez simplement :

    while time.time() - t - expiry < 0:
        yield r.get(fpKey)

Donc 1 aller-retour par itération. Avec la fonction, vous avez :

if r.exists(fpKey):
    return r.get(fpKey)

Donc 2 allers-retours par itération. Pas étonnant que le générateur soit plus rapide.

Bien sûr, vous êtes censé réutiliser la même connexion Redis pour des performances optimales. Inutile de lancer un benchmark qui se connecte/déconnecte systématiquement.

Enfin, concernant la différence de performances entre les appels Redis et les lectures de fichiers, vous comparez simplement un appel local à un appel distant. Les lectures de fichiers sont mises en cache par le système de fichiers du système d'exploitation, ce sont donc des opérations de transfert de mémoire rapides entre le noyau et Python. Il n'y a pas d'E/S de disque impliquées ici. Avec Redis, vous devez payer le coût des allers-retours, donc c'est beaucoup plus lent.