Heim  >  Artikel  >  Datenbank  >  So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

PHPz
PHPznach vorne
2023-05-28 10:12:231424Durchsuche

1. Betriebswirtschaftlicher Hintergrund

Ich habe beschlossen, diese Frage mit den Fragen auf der Prüfungsarbeit zu vergleichen, um nicht den Hintergrund der Projekte unseres Unternehmens vorzustellen. Was die Details des Geschäfts angeht, müssen Sie nicht darauf achten ~ Schauen Sie sich einfach den Titel an:

Angenommen, Sie sind der beste Sammler in einem bestimmten Land und haben verschiedene Schätze von aufeinanderfolgendem Wert in deinen Händen. Eines Tages könnte Ihnen Ihre Sammlung langweilig werden und Sie beschließen, diese wertvollen Gegenstände gegen Bargeld zu verkaufen.

Aber es ist zu niedrig, um diese wertvollen Schätze auf dem Gemüsemarkt zu verkaufen. Im „Internet+“-Zeitalter müssen wir natürlich einige andere Verkaufsmethoden anwenden: Es gibt ein Gebäude mit 300 Zimmern (Nummern 001 bis 300) und in jedem Zimmer gibt es jeden Tag einen passwortgeschützten Safe (vom 1. Dezember bis 31. Dezember) wählen Sie 300 der besten „Top-Schätze“ (auch Schätze der Klasse A genannt) aus und legen sie in die Safes dieser 300 Räume. Die Schätze, die im Raum platziert werden sollen, stehen bereits fest Wer Schätze kaufen möchte, muss mindestens einen Tag im Voraus online reservieren und anschließend mit dem Reservierungscode den Safe öffnen und die Ware abholen. Nicht reservierte Schätze werden von Ihnen zurückgenommen und nicht mehr verkauft.

Um ein solches Online-Reservierungssystem aufzubauen, sieht seine Frontend-Schnittstelle wahrscheinlich so aus:

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Drei im Bild oben Nach dem Anklicken des auszufüllenden Steuerelements erscheint ein Auswahlfeld. Das Problem ist nun, dass es in einem Raum nur einen Schatz gibt und dieser nicht doppelt gebucht werden kann. Nachdem der Käufer den Schatztyp und die Zimmernummer ausgewählt hat, wird empfohlen, bei der Auswahl des Reservierungsdatums im Datumsauswahlfeld einige sofortige Informationen anzugeben. Beispiel: Zimmer Nr. 051 wurde am 3. Dezember gebucht und jetzt hat ein anderer Benutzer Zimmer Nr. 051 ausgewählt. Wenn dann das Datumsauswahlfeld erscheint, muss der 3. Dezember als nicht auswählbar festgelegt werden. Wie unten gezeigt (der 3. Dezember wird als „fehlend“ angezeigt):

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Wie kann also ein so einfaches Inventarsystem in Redis gespeichert werden?

2. Bestandsverwaltungslösung (Redis)

Unsere ursprüngliche Idee ist, dass unser Bestand als riesiges dreidimensionales Array betrachtet werden kann, wobei die erste Dimension Schätze darstellt. Die zweite Dimension repräsentiert die Zimmernummer und die dritte Dimension repräsentiert das Reservierungsdatum. Redis bietet fünf Speichertypen: String, Hash, List, Set und Sorted Set. Wir können den Hash-Typ zum Speichern von Daten im aktuellen Szenario verwenden, da er unsere Anforderungen erfüllen kann, und der Set-Typ ist ebenfalls eine praktikable Option.

Der Schlüssel von Redis ist auf Schatztyp + Raumnummer eingestellt (z. B. A:205, A stellt den besten Schatz dar, 205 ist die Raumnummer), der Wert von Redis ist der Hash-Typ, und der Hash-Schlüssel ist das Datum (zum Beispiel 2016-12-05), der Hash-Wert ist wahr oder falsch und zeigt an, ob gebucht wurde oder nicht. Dargestellt in einem Diagramm als:

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Wenn am 8. Dezember Zimmer A der Kategorie 158 gebucht wurde, wird es als

#🎜🎜 gespeichert ##🎜 🎜#Redis-Schlüssel – A:158
1

2

3

Redis Key —— A:158

 

Redis Value —— hash table ['2016-12-08' => 1]

Redis-Wert – Hash-Tabelle [ '2016-12-08' => 1]
#🎜🎜#

3. Erweiterte Szenario- und Bestandsverwaltungslösung

Die Einführung von Top-Schätzen der Klasse A wurde sehr begrüßt und schon kurz nach der Einführung gingen zahlreiche Bestellungen ein. Viele Menschen aus der Mittelschicht interessieren sich für das Sammeln, doch die hohen Preise schrecken sie oft ab. Sie wählen also Schätze der Kategorie B aus Ihrer Sammlung aus. Sie sind den Schätzen der Kategorie A etwas unterlegen, aber der Preis ist angemessener und wird auch als „ausgezeichneter Schatz“ bezeichnet.

Da es in Typ B mehr Schätze gibt als in Typ A, planen Sie, in diesen 300 Räumen einen Safe aufzustellen. Dieses Mal werden Sie in 300 Räumen einen Safe aufstellen. Legen Sie in jede Kiste einen Schatz vom Typ B. Die nicht reservierten Schätze werden nach dieser Stunde zurückgenommen und durch Schätze für die nächste Stunde ersetzt. Nachdem der Käufer eine Reservierung vorgenommen hat, holt er den Schatz zu den vereinbarten Zeiten ab. Für Schätze der Kategorie B verfügt Ihr Reservierungssystem über eine zusätzliche Option, nämlich die Abholzeit. Wie im Bild unten gezeigt:

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Da es nun eine zusätzliche vorgegebene Bedingung (Abholzeit) gibt, denken Sie bei der Lagerung des Inventars grob darüber nach, dass das Inventar tatsächlich ein großes vierdimensionales Array ist. Dieser Satz kann wie folgt umgeschrieben werden: Zu den vierdimensionalen Informationen gehören Schatztyp, Zimmernummer, Reservierungsdatum und Abholzeit. Wie speichert man diese Art von Schatz in Redis?

Wenn Sie genau darüber nachdenken, ist unsere Speicherung in Redis bei der Speicherung von Schätzen der Klasse A eine Verschwendung von Dimensionen.

Tatsächlich wurde nur ein HashValue zum Speichern des vorgegebenen Status verwendet, was zu der Dimension führte an Informationen werden verschwendet. Wenn man bedenkt, dass die Abholzeit immer zur vollen Stunde erfolgt, also 0 bis 1 Uhr, 1 bis 2 Uhr, ..., 23 bis 24 Uhr, insgesamt 24 Situationen über den Tag verteilt, Daher können wir vollständig binäre Ganzzahlen verwenden, um die Zeit der reservierten Elemente darzustellen. Beispielsweise steht 1 für 0 bis 1 Punkt, 2 für 1 bis 2 Punkte, 4 für 2 bis 3 Punkte,...,

23 bis 24 Punkte können durch 2 hoch 23 (8388608) dargestellt werden. Um mehrere Zeiträume zu reservieren, müssen Sie lediglich eine logische ODER-Verknüpfung der Werte durchführen.

Auf diese Weise sieht unsere Redis-Struktur wie folgt aus:

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Zum Beispiel ist Raum 103, Schatz der Klasse B, am 5. und 6. Dezember von 8 bis 12 Uhr gebucht und wird in Redis als

gespeichert Redis-Wert —— Hash-Tabelle [ code>'2016-12-05'=> '2016-12-06'=> ]

1

2

3

Redis-Schlüssel —— B:103Redis Key  —— B:103

 

Redis Value —— hash table ['2016-12-05' => 3840, '2016-12-06' => 3840]

🎜🎜🎜

Für Schätze der Kategorie B müssen Sie bei neuen Reservierungen zuerst den ursprünglichen Hash-Wert herausnehmen, eine logische ODER-Operation mit der neuen geplanten Abholzeit durchführen und dann das Ergebnis im Gegensatz zu Kategorie A an Redis zurückschreiben. Genau wie bei Schätzen Rufen Sie hSet direkt auf, um den Hash-Wert festzulegen. Achten Sie beim Abbrechen der Reservierung darauf, zuerst den ursprünglichen Hash-Wert herauszunehmen, den abzubrechenden Zeitraum vom Hash-Wert abzuziehen (exklusives ODER + logisches UND) und dann hinzuzufügen verbleibend Die geplante Abholzeit wird an Redis zurückgeschrieben und hDel kann nicht direkt aufgerufen werden, um sie zu löschen.

4. Advanced & Inventory Management Plan

Seit der Einführung von Class-B-Schätzen ist Ihr Unternehmen viel beliebter geworden als zuvor. Es gibt also wieder eine große Nachfrage an Touristen, Studenten und anderen Menschen ohne große Ersparnisse, die sehr an Ihren Schätzen interessiert sind. Menschen, die in diese Stadt kommen, möchten ein paar Souvenirs mitbringen. Obwohl der Preis für Schätze vom Typ B etwas niedriger ist als der für Typ A, ist er für diese Leute immer noch etwas teuer. Sie entscheiden sich also dafür, Ihre günstigsten Schätze (Schätze der Kategorie C) zu verkaufen.

Von diesen 300 Räumen ist die größte Anzahl in Typ-C-Schätzen untergebracht, sodass Sie in jedem Raum 100 Schatzkisten speziell für die Aufbewahrung von Typ-C-Schätzen hinzufügen. Diese 100 Schatzkisten sind mit Nr. 1, Nr. 2,..., Nr. 100 nummeriert. Ebenso legen Sie jede Stunde des Tages einen Schatz vom Typ C in die 100 Schatzkisten in jedem dieser 300 Räume (was bedeutet, dass das gesamte Gebäude jede Stunde 30.000 Schätze vom Typ C aktualisiert). Wenn niemand reserviert, wird der Schatz in der nächsten Stunde ersetzt. Endlich können alle Bedürfnisse erfüllt werden.

Für Schätze vom Typ C sieht Ihre Reservierungsoberfläche so aus:

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Wir haben eine weitere Reservierungsbedingung hinzugefügt. Derzeit stehen wir vor dem Problem der Lagerhaltung. Wie üblich handelt es sich bei diesem Inventar um ein großes fünfdimensionales Array. Die Schatzart, die Zimmernummer, das Reservierungsdatum, die Abholzeit und die Schatzkiste-Nummer nehmen jeweils eine Dimension ein. Wir haben bereits alle Kapazitäten von Redis aufgebraucht. Was sollen wir jetzt tun, um Daten zu speichern?

Dieses Mal muss der Redis-Inventarspeicher mit Geschäftsmerkmalen kombiniert werden. Erstens haben die beiden Dimensionen Schatzkistennummer und Abholzeit nicht zu viele Wertebereiche. Es gibt nur 100 Schatzkistennummern. Ändern Sie einfach den Hashwert in ein Array mit einer Länge von 100 und jeder Position des Arrays enthält INT. Die vom Typ angegebene Abholzeit ist ausreichend. Der Hash-Wert kann jedoch nur eine Zeichenfolge sein ... Wir müssen also eine Array-Serialisierungsoperation durchführen und sie dann beim Lesen wieder deserialisieren. Glücklicherweise beträgt die Länge nur 100, sodass die Serialisierungseffizienz nicht zum Engpass des Systems wird.

Die Aufbewahrungsmethode ist: Am 23. und 24. Dezember wurden unter den Schätzen vom Typ C in Raum 258 die Schatztruhen mit den Nummern 97 und 99 zwischen 11 und 13 Uhr reserviert

Redis-Wert —— 23'=> '[97 => 6144, 99 => 24.12.2016'=> '[97 => 6144, 99 => 6144]'] code>

1

2

3

Redis-Schlüssel —— C:258Redis Key —— C:258

 

Redis Value —— hash table ['2016-12-23' => '[97 => 6144, 99 => 6144]''2016-12-24' => '[97 => 6144, 99 => 6144]' ]

🎜🎜🎜

Die binäre Darstellung von 6144 ist „110000000000“ und der Hash-Wert ist die Zeichenfolge nach der Array-Serialisierung. Das JSON-Format kann in tatsächlichen Projekten verwendet werden. Okay, jetzt verfügt Redis über Speicher für drei Arten von Schätzen.

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Wenn der Benutzer die Reservierung storniert oder eine neue Reservierung hinzufügt, ist es bei Schätzen der C-Kategorie auch nicht möglich, einfach hSet und hDel aufzurufen, um Einstellungen zu überschreiben und zu löschen. Die bereits reservierte Situation muss herausgenommen und angepasst werden mit der bereits geplanten Abholzeit.

5. Speicheroptimierung

Inventar ist theoretisch ein mehrdimensionales Array. Die Hauptarbeit, die wir leisten, besteht darin, jede Dimension sinnvoll zu speichern und das Hinzufügen, Löschen und Abfragen zu vereinfachen. Unter dem Gesichtspunkt der Speicherersparnis kann Redis leer sein, wenn zu Beginn keine Reservierung vorgenommen wurde. Für Schätze der Klasse A ist der Hash-Wert gleich false und es gibt keinen entsprechenden Redis-Schlüssel oder Hash-Schlüssel.

Darüber hinaus führt die Kombination des Schatztyps und der Raumnummer zur Erstellung eines Redis-Schlüssels zu einer größeren Anzahl von Schlüsseln im Zusammenhang mit dem Schatzinventar in Redis. Um die einheitliche Verwaltung dieser Schlüssel zu erleichtern, können wir speziell einen weiteren Redis-Cache hinzufügen Alle Redis-Schlüsselwerte im Zusammenhang mit dem Schatzinventar sind in der folgenden Abbildung dargestellt. Es ist zu beachten, dass in diesem Fall die Verwendung des festgelegten Datentyps anstelle der Verwendung des Hash-Datentyps die Anforderungen erfüllen kann, da die Komplexität des Hinzufügens, Löschens, Änderns und Abfragens des festgelegten Datentyps O (1) beträgt. Es speichert alle Inventarschlüsselwerte, die bereits in Redis vorhanden sind.

So verwenden Sie Redis für die geplante Inventar-Caching-Funktion

Ein Vorteil dieser Vorgehensweise besteht darin, dass wir, wenn wir eines Tages auf besondere Umstände stoßen und alle inventarbezogenen Caches leeren müssen, problemlos alle Inventarschlüssel herausnehmen und löschen können. Ein weiterer Vorteil besteht darin, dass es uns Ideen für die weitere Expansion liefert ... Stellen Sie sich vor, die komplizierteste Situation seien jetzt Schätze vom Typ C mit insgesamt 5 Dimensionen. Angenommen, Sie nutzen in Zukunft nicht mehr 300 Räume in einem Gebäude, sondern mehrere Gebäude, um Schätze zu verkaufen, dann müssen Benutzer bei der Bestellung eine weitere Dimension hinzufügen – die Gebäudenummer. Wenn wir auf diese Situation stoßen, können wir den zusätzlichen Inventarschlüsselsatz vollständig auf Gebäudenummern für die Verwendung reduzieren und so die Skalierbarkeit in komplexeren Situationen sicherstellen, die auftreten können.

Nach dieser Erweiterung müssen Sie jedes Mal, wenn Sie einen neuen Reservierungsdatensatz hinzufügen, darauf achten, ob der entsprechende Redis-Schlüsselwert bereits im Inventarschlüsselsatz vorhanden ist. Wenn er nicht vorhanden ist, müssen Sie den Redis-Schlüsselwert hinzufügen zum Inventarschlüsselsatz. Der Löschvorgang ist ähnlich.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Redis für die geplante Inventar-Caching-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen