2013-02-11 37 views
26

According to this thread, Jedis jest najlepszą rzeczą do wykorzystania, jeśli chcę używać Redis z Java.Czy istnieje osadzalna alternatywa Java dla Redis?

Jednak zastanawiałem się, czy istnieją jakieś biblioteki/pakiety zapewniające podobnie wydajne operacje zestawów do tych, które już istnieją w Redis, ale mogą być bezpośrednio osadzone w aplikacji Java bez potrzeby konfigurowania oddzielnych serwerów. (tj. przy użyciu Jetty dla serwera WWW).

Aby być bardziej precyzyjnym, chciałbym być w stanie zrobić to skutecznie następujący:

  1. Istnieje duży zbiór użytkowników M (M nie wiadomo z góry).
  2. Istnieje duży zestaw N pozycji.
  3. Chcemy, aby użytkownicy sprawdzali przedmioty, po jednym użytkowniku/elemencie naraz, co daje zapisany wynik (w normalnej bazie danych).
  4. Za każdym razem, gdy użytkownik przyjedzie, chcemy przypisać temu użytkownikowi przedmiot z najmniejsza liczba istniejących wyników, których użytkownik jeszcze nie widział. Daje to przybliżony przydział przedmiotów w kolejności do wszystkich przybywających użytkowników, gdy zależy nam tylko na tym, aby wszystkie przedmioty były oglądane mniej więcej tyle samo razy.

Powyższe dzieje się w sposób równoległy. Gdy M i N są duże, Redis osiąga powyższe wyniki znacznie wydajniej niż zapytania SQL. Czy jest jakiś sposób, aby to zrobić za pomocą wbudowanej biblioteki Java, która jest nieco bardziej lekka niż uruchomienie serwera Redis?

Rozumiem, że można napisać stos kodu za pomocą bibliotek współbieżności Java, które z grubsza przybliżają to (i do pewnego stopnia ja to zrobiłem), ale nie jest to dokładnie to, czego szukam tutaj.

Odpowiedz

11

Spójrz na project voldemort. Jest to rozproszony magazyn wartości klucz-wartość stworzony przez Linked-In i obsługuje możliwość osadzania.

W przewodniku szybkiego uruchamiania znajduje się mały przykład uruchomienia serwera jako wbudowanego w wersję samodzielną.

VoldemortConfig config = VoldemortConfig.loadFromEnvironmentVariable(); 
VoldemortServer server = new VoldemortServer(config); 
server.start(); 

Nie wiem zbyt wiele o Redis, więc nie mogę porównać ich funkcji do funkcji. W projekcie wykorzystaliśmy Voldemorta, użyliśmy go jako sklepu z obsługą tylko do odczytu z doskonałymi wynikami. Pozwoliło nam to "wstępnie skompilować" dwutygodniową bazę danych w naszym centrum przetwarzania danych i "wysłać ją" do najbardziej zaawansowanych centrów danych. W ten sposób każde centrum danych krawędzi ma lokalną kopię zbioru danych.

EDYCJA: Po ponownym przeczytaniu pytania, chciałem dodać Gauva's Table - Ta tabela DataStructure może być również coś, czego szukasz i jest simlar do tego, co masz z wielu baz danych bez sql.

+0

Brzmi bardzo interesujące ... więc mogę uruchomić instancję jednego węzła tylko dla lokalnych wyszukiwań i rzeczy? Sprawdzę to. –

+0

@AndrewMao Tak, obsługuje pojedynczy węzeł. Dodałem też link do struktury danych Gauva's Table. powodzenia i szczęśliwego polowania :-) – eSniff

-5

Google's Guava Library dostarcza przyjazne wersje tego samego (i więcej) operatorów Ustaw, które redis zapewnia.

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained

np

 
    Guava      Redis 
    Sets.intersection(a,b) sinter a b 
    a.count()     scard a 
    Sets.difference(a,b)  sdiff a b 
    Sets.union(a,b)   sunion a b 

Multisety są dość prostym pośrednikiem dla sortowanych zestawów redis.

+1

To zdecydowanie nie odpowiada na pytanie. Chociaż Guava jest niezwykle przydatną biblioteką ogólną, nie zapewnia magazynu kluczy i wartości. Wyniki tych metod wciąż muszą być utrzymywane w pewien sposób. – gyorgyabraham

+2

@gyabraham faktycznie, w wielu przypadkach Redis nie utrzymuje danych, inna baza danych to robi. Jest używany tylko jako szybki sposób obliczania zapytań, które byłyby prawie niemożliwe przy użyciu bazy danych. W każdym razie Guava naprawdę nie może zastąpić funkcji Redis. –

+1

Jedis to tylko Java API dla Redis. Baza danych nadal musi być jawnie uruchomiona poza procesem Java. –

4

Hazelcast dostarcza wiele rozproszonych implementacji struktur danych, które mogą być używane jako czysta Java jako alternatywa dla usług Redis. Następnie możesz wysłać pojedynczy "słoik" ze wszystkimi wymaganymi zależnościami, aby uruchomić aplikację. Być może będziesz musiał dostosować nieco inne prymitywy w stosunku do Redisa we własnej aplikacji.

Rozwiązania komercyjne w tej przestrzeni obejmują Teracotta's Enterprise Ehcache i Oracle Coherence.

0

Spójrz na Lmdb (baza danych pamięci błyskawicznej), ponieważ potrzebowałem dokładnie tego samego. Wdrażam aplikację dropwizard w kontenerze, a dodanie redis lub innej zależności zewnętrznej jest bolesne. Wydaje się, że działa dobrze, ma dobrą aktywność. fyi, jeszcze nie używałem tego w produkcji.

https://github.com/lmdbjava/lmdbjava

Powiązane problemy