2016-10-14 5 views
0

J'ai une certaine confusion dans redis. Je suis auto-apprentissage redis.Redis demande de traitement interne

Je dois savoir que redis est monothread et fonctionne sur le concept de boucle d'événement. Les opérations de lecture/écriture sont donc sérialisées en redis et il n'y a pas de condition de concurrence. Ma confusion est - quand je pense naïvement à l'architecture à un seul thread, je peux imaginer qu'il existe un tampon où toutes les demandes de lecture/écriture se rassemblent et le fil les planifie un par un. Mais dans une application Internet réelle où des milliers ou des millions de demandes doivent être traitées, comment redis gère-t-il ces demandes sans latence significative? Si une opération d'écriture dure quelques millisecondes, bloque-t-elle une autre opération d'écriture en lecture pendant cette période?

Redis implémente-t-il un concept de verrouillage comme le db relationnel? Si non, alors comment redis gère-t-il des milliers de lectures/écritures sans latence significative? N'importe quels internes/exemples seraient grands pour mon étude plus loin.

Répondre

1

Votre compréhension de Redis interne est tout à fait correcte. Il n'y a pas de système de verrouillage. Toutes les opérations sont atomiques et bloquantes.

La recommandation lors de l'utilisation de Redis est de faire plusieurs demandes courtes, au lieu d'une longue. Tenez compte de la complexité temporelle mentionnée dans la documentation Redis Commands lors de l'écriture de vos demandes, si vous travaillez sur un grand nombre de clés ou une grande structure de données. Évitez la commande KEYS, préférez la famille de commandes SCAN. Soyez encore plus prudent lorsque vous écrivez un script Lua qui sera envoyé à Redis en utilisant la commande EVAL.

Chaque requête ayant un temps d'exécution très court, les clients ne seront pas affectés, dans la plupart des cas d'utilisation, par le fait que les commandes Redis ne répondront à aucune autre commande pendant l'exécution d'une commande donnée.

La plupart du temps, le facteur limitant ne sera pas Redis lui-même, mais le réseau. Toutefois, dans certains cas, vous pouvez atteindre les limites de Redis (qui sont très élevées). Dans ces cas, vous pouvez utiliser multiple Redis instances en mode maître-esclave (réplication, surveillée par Redis Sentinel) et effectuer une sorte de répartition de charge entre les instances pour la lecture des demandes. Vous pouvez également utiliser un outil comme twemproxy devant plusieurs instances Redis.