Unter Windows Server 2019 habe ich es unter WSL aus Versehen redis-server
ein zweites Mal ausgeführt und es wurde kein Fehler beim Binden des Listening-Sockets gemeldet. Hier ist die Ausgabe von netstat
:
C:\Users\Administrator>netstat -ano | grep 6379 | grep LISTEN
TCP 0.0.0.0:6379 0.0.0.0:0 LISTENING 11080
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING 13292
TCP [::]:6379 [::]:0 LISTENING 11080
TCP [::1]:6379 [::]:0 LISTENING 13292
Zwei Fragen:
- Wie ist das überhaupt möglich?
- Wie kann ich auswählen, mit welcher Instanz eine Verbindung hergestellt werden soll
redis-cli
?
Danke.
BEARBEITEN
Ich habe es zur Kontrolle ein drittes Mal ausgeführt und hier ist die netstat
Ausgabe:
C:\Users\Administrator>netstat -ano | grep 6379 | grep LISTEN
TCP 0.0.0.0:6379 0.0.0.0:0 LISTENING 13916
TCP 0.0.0.0:6379 0.0.0.0:0 LISTENING 11080
TCP 127.0.0.1:6379 0.0.0.0:0 LISTENING 13292
TCP [::]:6379 [::]:0 LISTENING 11080
TCP [::]:6379 [::]:0 LISTENING 13916
TCP [::1]:6379 [::]:0 LISTENING 13292
Antwort1
Wenn die Buchse dieSO_REUSEADDRFlag gesetzt ist, können mehrere Prozesse an einen bestimmten Port gebunden werden.
"Verwenden SO_REUSEADDR
undSO_EXCLUSIVEADDRUSE
"
Verwenden von
SO_REUSEADDR
Mit der
SO_REUSEADDR
Socket-Option kann ein Socket zwangsweise an einen Port gebunden werden, der von einem anderen Socket verwendet wird. Der zweite Socket ruft setsockopt mit dem Parameter optnameSO_REUSEADDR
und dem Parameter optval auf den booleschen Wert TRUE auf, bevor er bind auf demselben Port wie der ursprüngliche Socket aufruft.
Dies soll es Diensten ermöglichen, die Last auf mehrere unabhängige Prozesse aufzuteilen, und sollte nur verwendet werden, wenn der Dienst dies korrekt handhaben kann … Redis gehört möglicherweise zu den Diensten, die dies unterstützen (und standardmäßig aktivieren).
Sehennet.c
:
static int redisSetReuseAddr(redisContext *c) {
int on = 1;
if (setsockopt(c->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) {
__redisSetErrorFromErrno(c,REDIS_ERR_IO,NULL);
redisNetClose(c);
return REDIS_ERR;
}
return REDIS_OK;
}
static int redisCreateSocket(redisContext *c, int type) {
redisFD s;
if ((s = socket(type, SOCK_STREAM, 0)) == REDIS_INVALID_FD) {
__redisSetErrorFromErrno(c,REDIS_ERR_IO,NULL);
return REDIS_ERR;
}
c->fd = s;
if (type == AF_INET) {
if (redisSetReuseAddr(c) == REDIS_ERR) {
return REDIS_ERR;
}
}
return REDIS_OK;
}
Wenn Sie herausfinden möchten, mit welchem Server Sie verbunden sind, können Sie den Redis-Befehl verwenden.INFO server
, und suchen Sie nach dem process_id
Feld.
Alternativ können Sie netstat -ano
unter Windows ( netstat -tnp
unter Linux) verwenden, um die PID des Servers für einen bestimmten Client-Port zu bestimmen (allerdings nicht die Client-PID).
Ich glaube nicht, dass es eine einfache Methode auf Betriebssystemebene gibt, um diese Beziehung zu bestimmen.
Wenn Sie mehrere Serverinstanzen mit unterschiedlicher Konfiguration und/oder Daten haben, liegt ein Konfigurationsfehler vor, derDusollte behoben werden – d. h.: Führen Sie nicht mehrere Dienste gleichzeitig aus oder verwenden Sie für jeden einen anderen Port.
Dies liegt nicht in der Verantwortung von Redis, ebenso wie die Auswahl des Abhörports nicht in den Zuständigkeitsbereich von Redis fällt.