Redigo ist ein Golang-Client für die redis-Datenbank. Es verwendet die Struktur 10, um einen Pool von Verbindungen aufrechtzuerhalten. Diese Struktur enthält eine Mutex-Sperre für die parallele Anwendung und Verbindung der Anwendung.Redigo-Verbindungspool - Warum die Sperre beim Entfernen der veralteten Verbindung aufheben
type Pool struct {
// ...
IdleTimeout time.Duration
mu sync.Mutex
// Stack of idleConn with most recently used at the front.
idle list.List
}
In seinen get
Verfahren entfernt Verbindungspool abgestanden (Leerlaufzeit) Verbindungen erstens. Wenn eine veraltete Verbindung gefunden wird, wird sie vom Pool freigegeben, gibt die Sperre frei, schließt die Verbindung und versucht erneut, die Sperre zu aktivieren.
Warum entsperrt Pool und versucht, Sperre wieder zu erwerben, anstatt nur entsperren, bevor Funktion zurückkehrt? Ich schätze, dass das Schließen einer Verbindung ziemlich viel Zeit kosten kann, was andere Goroutine-Wartezeiten auf diesen Mutex verlangsamen wird.
Hier ist die ganze Pool get method
Ich denke, Ihre Vermutung ist richtig. Das Schließen einer Verbindung kann einige Zeit in Anspruch nehmen. Es scheint unklug, die gesamte Nutzung des Pools für diese Zeit zu sperren. –