2016-08-07 43 views
0

Ich habe eine MySQL-Tabelle "number_records" mit mehr als 10 Millionen Einträge. Die Tabelle hat folgende Struktur.wie eine mysql-tabelle in redisis zu konvertieren

id | number  | cat_id | dialed | uuid | 

1 | 2123727345 | 148 | 0 |  | 

2 | 2123727346 | 148 | 0 |  | 

3 | 212372737 | 147 | 0 |  | 

Ich habe zwei Prozesse gleiche cat_id mit (148), aber unterschiedlichem UUID gleichzeitig obige Tabelle mit Zahlen zu erhalten.

Erster Prozessuuid = abcd-efgh-12345-78908

Zweiter Prozessuuid = zxcv-qwrt-uuuu-kklll

Ich möchte, dass jeder Prozess nur eine eindeutige Nummer erhält und nach dem gewählten Status auf ‚1‘ gesetzt Verarbeitung. (Beide Prozesse erhalten nicht die gleiche Nummer)

Ich mache oben in drei Abfragen in jedem Prozess, so dass jeder Prozess nur eine eindeutige Nummer erhält.

Für den ersten Prozess.

  1. update numbers_records set uuid = 'abcd-efgh-12345-78908' where cat_id = 148 and dialed = 0 and uuid = "";

  2. select number from numbers_records where uuid = 'abcd-efgh-12345-78908' and dialed = 0 and cat_id = 148;

  3. update numbers_records set dialed = 1 where uuid ='abcd-efgh-12345-78908' and cat_id = 148 and dialed = 0;

für den zweiten Prozess.

  1. update numbers_records set uuid = 'zxcv-qwrt-uuuu-kklll' where cat_id = 148 and dialed = 0 and uuid = "";

  2. select number from numbers_records where uuid = 'zxcv-qwrt-uuuu-kklll' and dialed = 0;

  3. update numbers_records set dialed = 1 where uuid = 'zxcv-qwrt-uuuu-kklll'

Dieser Prozess funktioniert gut. Und über Abfragen stellen Sie sicher, dass ich eine eindeutige Nummer pro Prozess bekomme.

Die Tabelle enthält jedoch mehr als 10 Millionen Datensätze. Und diese Abfragen dauern mehr als 5 Sekunden. Ich möchte den Prozess beschleunigen.

Mein Manager bat mich, über den Tisch zu Redis zu verschieben.Und ich bin verwirrt, wie man über Tisch verschiebt.

Wie könnte ich Redis im obigen Fall verwenden?

Jeder Vorschlag wird sehr geschätzt. Beste Grüße.

Antwort

0

Sieht aus wie Sie MySql Tabelle als Aufgabenwarteschlange verwenden. Sie können Redis LIST mit LPOP oder Operationen verwenden, um die nächste Aufgabe in Worker zu erhalten, und HASH, um Aufgabeninformationen zu speichern.Auch wenn Sie auf cat_id Verarbeitung basierend brauchen müssen Sie Aufgaben an verschiedenen Listen drücken:

... number_records_tasks:147 number_records_tasks:148 ...

Um mehrere Aufgaben zu bekommen auf einmal Vorschläge verwenden, um von diesen question.

0

Da Sie keine Einträge in dieser Tabelle löschen, ist jede Lösung, die nur auf der Struktur einer Warteschlange basiert, nicht gleich - nach der Verarbeitung des Elements in der Warteschlange verlieren Sie sie.

Das Einzige, was Sie tun können, ist, einen anderen Mechanismus oberhalb der MySQL-Tabelle hinzuzufügen, um die Arbeitswarteschlange zu bearbeiten (rediselliste, rabbitmq, beanstalkd).

Meiner Meinung nach sollten Sie andere Lösungen zuerst überprüfen, können sie wesentlich einfacher in der Umsetzung sein:

  • tun Sie mehrspaltigen Index (cat_id, gewählt, UUID) und groß genug, um Speicherpuffer in Ihrer Datenbank? Selbst mit 10 Millionen Datensätze sollten diese Abfragen sehr schnell sein, wenn der Index mit
  • Sie Tabellenpartitionierung (https://dev.mysql.com/doc/refman/5.5/en/partitioning-types.html) verwenden könnte diese Tabelle in kleinere zu teilen