2017-11-08 3 views
0

Ich arbeitete an einem Programm, das ein Cache-System benötigt. so die Beschreibung ist, habe ich eine MySQL-Datenbank, die 4 Spalten hat, 'Mac', 'src', 'Benutzername', 'Haupt' Welche Mac, Src, Benutzername sind Schlüssel/Werte und Fremdschlüssel in Haupttabelle. Es wird zuerst in diese 3 eingefügt und ihre ID in main eingefügt. Die Daten, die ich bekam, sind ungefähr 18m für Haupttabelle und für die 3 ungefähr 2m jeder. Ich möchte nicht jedes Mal ein select verwenden, wenn es in main eingefügt werden muss, also habe ich ein Array verwendet, um sie zwischenzuspeichern. $ hash = ['mac' => [], 'src' => [], 'Benutzername' => []]; und speichern Sie Daten wie folgt: $ hash ['mac'] ['54: 52: 00: 27: e4: 91'];PHP-Cache-Mechanismus

Dieser Ansatz hat eine schlechte Leistung, wenn die Hash-Daten über 500k hinausgehen; Gibt es einen besseren Weg, dies zu tun?

PS: Ich habe die gleiche Sache mit NodeJS, die ich ein NPM-Modul namens Hashtable und Leistung verwendet wurde etwa 10k Einsätze je 4m. Ich habe über PHP-Arrays gelesen und herausgefunden, dass sie Hashtables sind, aber jetzt macht es den gleichen Job mit weitem Wegweiser, für nur 1k dauert es mindestens 5 Minuten;

+1

Vergib mir, aber es ist mir nicht klar, warum Sie brauchen einen Cache von irgendetwas dort zu verwenden. Wenn Sie nur Inserts machen, warum müssen Sie jedes Mal riesige Datenmengen auswählen? Vielleicht, wenn Sie mehr über die Tabellenstruktur erklären, werde ich besser verstehen. – jaswrks

+0

@jaswrks lassen Sie mich mit einem Beispiel erklären: in 'Mac' Tabelle, ich habe 2 Millionen Daten, ID und Wert, z. ID = 100100, Wert = '54: 52: 00: 27: e4: 91 '; In meiner Haupttabelle muss ich die Zeile einfügen, also brauche ich die 'mac ID für' 54: 52: 00: 27: e4: 91 'whichis 100100'. Ich kann dies durch eine Insert-Select-Abfrage tun, die sehr schlecht funktioniert, oder durch irgendeine Art von Cache-System. und bitte korrigieren Sie mich, wenn Sie denken, es ist kein guter Weg. –

Antwort

0

Angenommen, Sie sind auf einem Linux-Server. Siehe: Creating a RAM disk. Sobald Sie eine RAM-Disk haben, cachen Sie jede ID als eine Datei, mit einem sha1() Hash der MAC-Adresse. Die RAM-Disk-Datei ist, na ja, RAM; ein persistenter Cache im Speicher.

<?php 
$mac = '54:52:00:27:e4:91'; 
$cache = '/path/to/ramdisk/'.sha1($mac); 

if (is_file($cache)) { // Cached already? 
    $ID = file_get_contents($cache); // From the cache. 
} else { 
    // Run SQL query here and get the $ID. 

    // Now cache the $ID. 
    file_put_contents($cache, $ID); // Cache it. 
} 
// Now do your insert here. 

Zur Klarstellung: Eine RAM-Disk Sie Dateisystem-Wrapper in PHP, wie file_get_contents() und file_put_contents() zum Lesen/Schreiben in den RAM verwenden.


Andere robustere Alternativen zu prüfen: