2013-06-17 19 views
8

Przeprowadzam analizę strumienia danych i publikuję wyniki na kanale Redis. Konsumenci subskrybują te kanały i otrzymują pliki danych w czasie rzeczywistym. Wszystkie wyniki analizy danych historycznych zostaną utracone.Projekt struktury danych Redis do sortowania wartości opartych na czasie

Teraz chcę dodać możliwość przechowywania danych historycznych w Redis, aby konsumenci mogli wyszukiwać dane historyczne (głównie według czasu). Ponieważ wyniki analizy są podzielone według czasu, jaki byłby dobry projekt do przechowywania wyników w Redis?

+0

Bądź ostrożny, że Redis wydajność klucz degraduje się liniowo z liczbą kluczy, które otrzymujesz. Jeśli więc przechowujesz dużą listę (głównie) sąsiednich danych, pobranie N razy zajmuje N razy więcej niż jednoniciowa reprezentacja przedziałów czasowych danych. (Nie jest to problem dla 300 wartości ... ale kilka rzędów wielkości dodanego opóźnienia dla wartości 100k). –

+0

@Nisan - Nie sądzę, że całkowicie rozumiem. Czy podejście (używając zsets poniżej) będzie miało tę karę wydajności, jeśli przechowuję datę co 30 sekund. –

+0

Spróbuj wypełnić listę o żądanym rozmiarze i mierząc czas potrzebny do jej odczytania. Teraz wypróbuj to samo, zapisując całą listę jako ciąg znaków (na przykład jako serializowany obiekt JSON, chociaż z pewnością jest więcej opcji skompresowanych/wydajnych). Z mojego doświadczenia wynika, że ​​w przypadku bardzo dużych list (np. Elementy 50k-500k) jednorodnego typu danych (np. Liczby całkowite z co najwyżej cyframi K), przechowywanie całej listy w postaci ciągów czasowych i rozpakowywanie było około 1000 razy szybsze. po przeczytaniu z Redis. –

Odpowiedz

23

Użyj redis sorted sets.

Posortowane zestawy przechowują dane w oparciu o "wyniki", więc w twoim przypadku wystarczy użyć znacznika czasu w milisekundach; dane będą sortowane automatycznie, co pozwala na odzyskanie pozycji historycznych za pomocą date start/koniec zakresy, oto przykład ...

Dodawanie elementów do posortowanej zestaw ...

zadd historical <timestamp> <dataValue> 

..add niektóre Przykładowe dane ..

zadd historical 1 data1 
zadd historical 2 data2 
zadd historical 3 data3 
zadd historical 4 data4 
zadd historical 5 data5 
zadd historical 6 data6 
zadd historical 7 data7 

..retrieve podzbioru elementów wykorzystujących zakres start/koniec ...

zrangebyscore historical 2 5 

..returns. ..

1) "data2" 
2) "data3" 
3) "data4" 
4) "data5" 

Więc w twoim przypadku, jeśli chcesz pobrać wszystkie historycznych przedmiotów do ostatniego dnia, po prostu to zrobić ...

zrangebyscore historical <currentTimeInMillis> <currentTimeInMillis - 86400000> 
+0

Co się stanie, jeśli dwie dane wstawią w tym samym milisekundach? – Lupus

+0

Podczas gdy członkowie są unikatowi w posortowanym zestawie, wyniki (w tym przypadku znaczniki czasu) mogą się powtarzać. – raffian

+0

Co się stanie, jeśli każda wartość danych nie będzie unikalna? – MasterScrat

Powiązane problemy