[Redis] Database-strategie en tijd

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • WK100
  • Registratie: Februari 2011
  • Laatst online: 07-10 07:33
Ik heb een probleempje waarvoor ik even geen idee heb wat de juiste aanpak zou zijn. Ik heb het probleem naar een goede oude abstractie, genaamd effectenbeurs, versimpeld die het probleem perfect omschrijft.

Stel, we hebben een Redis-instantie die transacties van een beurs naar het geheugen moet wegwerken. Dit wordt vervolgens gevoerd naar een applicatie. Echter kan deze instantie niet data van elke transactie opslaan. Er is besloten om dit op request-basis te doen.

De applicatie vraagt naar de historie van een bepaald aandeel, wat bij de beurs opgehaald zal worden en zowel naar de applicatie als naar de Redis-instantie gestuurd worden. De opgeslagen data krijgt een timeout meegekregen voor deze weer verwijderd wordt.

Dit lijkt aardig op een cache, niet?


In ieder geval, een transactie bevat een aantal eigenschappen waaronder:

- prijs
- volume
- unieke index (vorige index + 1)
- timestamp (tijd sinds epoch)

De huidige manier van opslaan gebeurt in een Hash, met als key exchange:stock:index en de velden bezitten dus bovenstaande eigenschappen.
Om deze toch op tijd te kunnen sorteren wordt er tevens een Sorted Set aangemaakt met dezelfde key als de hash, en een score van timestamp.

Op die manier kun je zrangebyscore gebruiken om de transacties binnen een bepaald tijdframe op te roepen.


Tot nog toe werkt alles vrij vlekkeloos. Hier komt het probleem:
Niet elke seconde vindt er een transactie plaats!

Hoe zorg ik ervoor dat er geen gaten in de data zitten?
Als de opgeslagen data in mijn Sorted Set tussen tijd = 10 en tijd = 20 er zo uitziet:

KeyScore
AEX:ASML:11113
AEX:ASML:11214
AEX:ASML:11315
AEX:ASML:11417

Kan het namelijk mogelijk zijn dat er alleen vanaf 13 tot 17 seconden data is opgehaald en dat de rest van de data ontbreekt. Het kan ook mogelijk zijn dat er wel is geluisterd naar transacties maar die er simpelweg niet waren.