7 Stimmen

Was ist der schnellste und effizienteste Weg, um Bilder zu speichern und abzurufen, wenn Sie Millionen von Benutzern auf einem LAMP-Server haben?

Hier ist die beste Methode, die mir bisher eingefallen ist, und ich würde gerne wissen, ob es eine noch bessere Methode (ich bin sicher, dass es sie gibt!) zum Speichern und Abrufen von Millionen von Benutzerbildern gibt:

Um die Größe der Verzeichnisse gering zu halten und zusätzliche Aufrufe an die DB zu vermeiden, verwende ich verschachtelte Verzeichnisse, die auf der Grundlage der eindeutigen ID des Benutzers wie folgt berechnet werden:

$firstDir = './images';
$secondDir = floor($userID / 100000);
$thirdDir = floor(substr($id, -5, 5) / 100);
$fourthDir = $userID;
$imgLocation = "$firstDir/$secondDir/$thirdDir/$fourthDir/1.jpg";

Die Benutzer-IDs ( $userID ) reichen von 1 bis in die Millionen.

Wenn ich also die Benutzer-ID 7654321 wird zum Beispiel das erste Bild des Benutzers gespeichert:

./images/76/543/7654321/1.jpg

Für Benutzer-ID 654321 :

./images/6/543/654321/1.jpg

Für Benutzer-ID 54321 wäre es:

./images/0/543/54321/1.jpg

Für Benutzer-ID 4321 wäre es:

./images/0/43/4321/1.jpg

Für Benutzer-ID 321 wäre es:

./images/0/3/321/1.jpg

Für Benutzer-ID 21 wäre es:

./images/0/0/21/1.jpg

Für Benutzer-ID 1 wäre es:

./images/0/0/1/1.jpg

Dadurch wird sichergestellt, dass ich bei bis zu 100.000.000 Benutzern nie ein Verzeichnis mit mehr als 1.000 Unterverzeichnissen habe, so dass es sauber und effizient zu sein scheint.

Ich habe diese Methode mit der folgenden "Hash"-Methode verglichen, die die schnellste in PHP verfügbare Hash-Methode (crc32) verwendet. Diese "Hash"-Methode berechnet das zweite Verzeichnis als die ersten 3 Zeichen im Hash der Benutzer-ID und das dritte Verzeichnis als die nächsten 3 Zeichen, um die Dateien zufällig aber gleichmäßig wie folgt zu verteilen:

$hash = crc32($userID);
$firstDir = './images';
$secondDir = substr($hash,0,3);
$thirdDir = substr($hash,3,3);
$fourthDir = $userID;
$imgLocation = "$firstDir/$secondDir/$thirdDir/$fourthDir/1.jpg";

Diese "Hash"-Methode ist jedoch langsamer als die oben beschriebene Methode und ist daher nicht geeignet.

Ich bin dann noch einen Schritt weiter gegangen und habe eine noch schnellere Methode gefunden, um das Dritte Verzeichnis in meinem ursprünglichen Beispiel zu berechnen ( floor(substr($userID, -5, 5) / 100); ) wie folgt:

$thirdDir = floor(substr($userID, -5, 3));

Dies ändert nun, wie/wo die ersten 10.000 Benutzer-IDs gespeichert werden, wodurch einige dritte Verzeichnisse entweder 1 Benutzer-Unterverzeichnis oder 111 statt 100 haben, aber es hat den Vorteil, schneller zu sein, da wir nicht durch 100 dividieren müssen, also denke ich, dass es sich langfristig lohnt.

Sobald die Verzeichnisstruktur definiert ist, plane ich, die einzelnen Bilder wie folgt zu speichern: Wenn ein Benutzer beispielsweise ein zweites Bild hochlädt, würde es im selben Verzeichnis wie das erste Bild gespeichert werden, aber es würde den Namen 2.jpg . Das Standardbild des Benutzers würde immer nur sein 1.jpg wenn sie also beschließen, ihr 2. Bild zum Standardbild zu machen, 2.jpg würde umbenannt werden in 1.jpg y 1.jpg würde umbenannt werden in 2.jpg .

Zu guter Letzt, wenn ich mehrere Größen desselben Bildes speichern müsste, würde ich sie wie folgt für Benutzer-ID 1 speichern (zum Beispiel):

1024px:

./images/0/0/1/1024/1.jpg
./images/0/0/1/1024/2.jpg

640px:

./images/0/0/1/640/1.jpg
./images/0/0/1/640/2.jpg

Das war's dann auch schon.

Gibt es bei dieser Methode irgendwelche Mängel? Wenn ja, könnten Sie diese bitte aufzeigen?

Gibt es eine bessere Methode? Wenn ja, könnten Sie sie bitte beschreiben?

Bevor ich mit der Umsetzung beginne, möchte ich sicherstellen, dass ich die beste, schnellste und effizienteste Methode zum Speichern und Abrufen von Bildern habe, damit ich sie nicht wieder ändern muss.

Danke!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X