2011-08-04 9 views
13

Jestem trochę noob, więc idę ...Kiedy używać magazynu klucz-wartość do tworzenia stron internetowych?

Kiedy ktoś użyje pary klucz-wartość (Redis, memcache, itp.) Do tworzenia stron internetowych? Rzeczywisty przypadek użycia byłby najbardziej przydatny.

Moje zamieszanie polega na tym, że prosta baza danych wydaje się o wiele bardziej funkcjonalna, ponieważ, jak mi się wydaje, może zrobić wszystko, co potrafi przechowywać klucz i wartość, PLUS pozwala także na filtrowanie/wysyłanie zapytań. Co oznacza, moim zdaniem, NIE można filtrować jak: select * homes where price > 100000 z magazynem kluczy i wartości.

UPDATE:

Zróbmy to przykład bardziej realne. Załóżmy, że StackOverflow używa magazynu klucz-wartość (memcache, redis, itp.).

W jaki sposób składnica klucz-wartość pomogłaby w zaspokojeniu potrzeb hostingu Stackoverflow?

+1

Na pewno można zrobić filtry w sklepach z kluczem wartości, jeśli chcesz - zależy częściowo od wdrożenia sklepu i może na własną pomysłowość. –

Odpowiedz

3

Magazyny z kluczem wartości są zazwyczaj bardzo szybkie, więc dobrze jest mieć je jako pamięć podręczną dla danych, do których dostęp jest bardzo ograniczony i które rzadko są aktualizowane w celu zmniejszenia obciążenia bazy danych.

Jak pan powiedział, to są zwykle ograniczone z zapytaniami (choć MongoDB obsługuje je całkiem dobrze), ale przechowuje klucz-wartość są głównie przeznaczone do uzyskiwania dostępu do dokładnych danych: profil użytkownika X'S, informacje o sesji X w, itp

"Tradycyjne" DB prawdopodobnie będzie wystarczające dla przeciętnej strony internetowej, ale jeśli napotkasz duże obciążenia, magazyny z kluczem wartości mogą naprawdę pomóc w czasie ładowania.

EDYCJA: I przez "duże obciążenia", mam na myśli naprawdę duże obciążenia. Przechowywanie wartości klucz-wartość rzadko jest konieczne.

See this comparison of key-value stores.

+0

Dzięki za link, aż za bardzo pomocne. –

+0

czy twoja odpowiedź nadal ma zastosowanie, jeśli masz tablicę json z 1000 pozycji i 8 polami łańcucha na element, który musi być odświeżany co 20 sekund i będzie dostępny przez rozmyte wyszukiwanie kluczy? – PirateApp

5

nie należy mylić z bazy danych typu NoSQL coś jak memcached (która nie jest przeznaczona do przechowywania danych na stałe).

Typowym zastosowaniem memcached jest przechowywanie wyników zapytań, do których ma dostęp klaster serwerów internetowych - np. udostępniona pamięć podręczna. Na przykład. Na tej stronie znajduje się lista pokrewnych postów i prawdopodobnie istnieje trochę pracy, aby baza danych mogła wykonać tę listę. Jeśli zrobisz to za każdym razem, gdy ktoś załaduje stronę, utworzysz dużo pracy dla bazy danych. Zamiast tego, wyniki raz pobrane po raz pierwszy mogą być przechowywane na memcached serwerze z kluczem będącym identyfikatorem strony. Każdy z serwerów WWW w klastrze może wtedy pobrać te informacje bardzo szybko, bez konieczności ciągłego uderzania w bazę danych. Po chwili wpis w pamięci podręcznej zostanie wyczyszczony przez memcached, dzięki czemu wyniki dla starych artykułów nie będą zajmować więcej miejsca. [Zastrzeżenie: nie mam pojęcia, czy StackOverflow robi to w rzeczywistości].

Z kolei baza danych "NoSQL" służy do trwałego przechowywania informacji. Jeśli twój schemat danych jest dość prosty, podobnie jak twoje zapytania, może być szybszy niż standardowa baza danych SQL. Wiele aplikacji internetowych nie wymaga bardzo skomplikowanych baz danych, więc bazy danych NoSQL mogą być dobrym rozwiązaniem.

+0

Dlaczego zamiast tego po prostu nie buforowałbyś strony CAŁKOWITA? – Jacjoi

+0

Można buforować części strony, ale nie wszystkie, ponieważ (na przykład) ma mój login na górze mojej wersji. Ale jest to całkiem słuszne - możesz przechowywać w pamięci podręcznej dość dużo jako fragment kodu HTML. –

1

Po prostu dodając do odpowiedzi bstrawson, w „członkow- cache -d” to mechanizm buforowania podczas Redis jest stałe przechowywanie ale zarówno przechowywania danych jak pary klucz-wartość.

Wyszukiwanie w pamięci klucz-wartość (coś w rodzaju Redis lub Membase) bardziej przypomina wyszukiwanie całej wartości w relacyjnej bazie danych, zbyt wolne.Jeśli chcesz wykonać pewne zapytania, możesz potrzebować przejść do zorientowanego na dokumenty typu DB typu NoSQL, takiego jak MongoDB lub CouchDB, w którym możesz wykonać część zapytania.

pobliżu przyszłości będziesz w stanie obsłużyć couchbase zerwać 2.0, które rozwiążą wszystkie problemy płonąca danych NoSQL zapytań z nowo wprowadzonej UnQL i buforowania (wywodzącymi się bezpośrednio z kodu źródłowego memcached)

3

Istnieją dwa ogólne opłacalne wykorzystanie -cases dla NoSQL:

  1. rozwoju Rapid Application
  2. Massively skalowalne systemy

Fakt, że większość rozwiązań noSQL jest efektywnych bez schematów; wymagać znacznie mniej uroczystości do działania; są lekkie (pod względem API); i zapewniają znaczny wzrost wydajności w przeciwieństwie do bardziej kanonicznych relacyjnych systemów trwałości informuje ich przydatności dla powyższych 2 przypadków użycia (w sensie ogólnym).

Będąc cyniczni - czy może praktyczny w sensie biznesowym - można zaproponować 3rd ogólnego użytku przypadków dla systemów NoSQL (jeszcze poinformowani o powyższym zestawem cech/funkcji):

Łatwiej Grock i każdy niedoświadczony (ale nie-mózg-martwy) przygważdżony geek może go podnieść w mgnieniu oka. To bardzo ważna funkcja. (Spróbuj, że z Oracle ..)

Więc use-przypadki systemów NoSQL - co w ogóle może być scharakteryzowane jako zrelaksowany trwałych systemów - są optymalnie poinformowani przez względami praktycznymi.

Nie ma absolutnie żadnych wątpliwości - poza niezwykle masowo skalowalnymi systemami - że systemy RDBMS są formalnie doskonałymi systemami zaprojektowanymi w celu zapewnienia integralności danych.

0

Stack Overflow rzeczywiście używa Redis i szeroko. Szczegółowa odpowiedź na twoje pytanie, z Stack Overflow jako przykładem, w a couple of niceblog posts autorki @Mark Gravell. Mark jest autorem znakomitej biblioteki asynchronicznej .NET Redis w wersji Booksleeve.

11

Nie mogę odpowiedzieć na pytanie, kiedy użyć magazynu danych klucz-wartość (w tym przypadku), ale mogę pokazać niektóre przykłady i odpowiedzieć na przykład stackoverflow.

Przy dostępie do bazy danych większość potrzebnych informacji to sklep z kv. Na przykład użytkownik loguje się przy użyciu nazwy użytkownika "joe". Sprawdzasz "user: joe" w swojej bazie danych i odzyskujesz swoje hasło (oczywiście hash). A może masz hasło pod "user: pass: joe", to naprawdę nie ma znaczenia. Jeśli był to przepełnienie stosu i renderowałeś stronę http://stackoverflow.com/questions/6935566/when-to-use-a-key-value-store-for-web-development, szukałeś "pytania: 6935566" i używałeś tego. Łatwo jest zobaczyć, w jaki sposób sklepy Kv mogą rozwiązać większość problemów.

Chciałbym powiedzieć, że sklep z kv jest podzbiorem funkcjonalności oferowanym przez tradycyjny RDMS. Dzieje się tak, ponieważ projekt tradycyjnego RDMS zapewnia wiele problemów związanych z skalowaniem i ogólnie traci funkcje podczas skalowania. Sklepy z kv nie mają tych funkcji, więc nie ograniczają cię. Jednak funkcje te często mogą być tworzone w każdym razie, zaprojektowane z rdzenia, aby były skalowalne (ponieważ staje się natychmiast oczywiste, jeśli nie są).

Jednak nie oznacza to, że są rzeczy, których nie można zrobić. Na przykład wspomniałeś o wyszukiwaniu.Jest to pułapka wielu sklepów Kv, ponieważ są one zwykle agnostyczne dla wartości (nie zawsze prawdziwe, przykład, redis i więcej) i nie mają możliwości znalezienia tego, czego szukasz. Co gorsza, nie są zaprojektowane, aby zrobić to szybko, po prostu są naprawdę szybkie wyszukiwanie za pomocą klucza.

Jednym z rozwiązań tego problemu jest leksykograficzne sortowanie kluczy i udzielanie zapytań dotyczących zakresu. Jest to zasadniczo "daj mi wszystko między pytanie: 1 i pytanie: 5". Ten przykład jest dość bezużyteczny, ale istnieje wiele zastosowań zapytań o zakres.

Powiedziałeś, że chcesz mieć wszystkie domy powyżej 100 000 $. Gdybyś chciał móc to zrobić, utworzyłbyś indeks domów według ceny. Powiedzmy, że masz następujące domy.

house:0 -> {"color":"blue","sold":false,"city":"Stackoverville","price":500000} 
house:1 -> {"color":"red","sold":true,"city":"Toronto","price":150000} 
house:2 -> {"color":"beige","sold":false,"city":"Toronto","price":40000} 
house:3 -> {"color":"blue","sold":false,"city":"The Blogosphere","price":110000} 

W SQL można przechowywać każde pole w kolumnie, a nie wszystkie dokumenty w jednym (w tym przypadku JSON). I mógł SELECT * FROM houses WHERE price > 100000. Wydaje się, że wszystko jest w porządku i jest eleganckie, ale jeśli nie ma indeksu, wymaga to obejrzenia każdego domu w twoim stole i sprawdzenia jego ceny, co jeśli masz kilka milionów domów, może być wolne. Więc w sklepie z kv potrzebujesz również indeksu. Główną różnicą jest to, że baza danych SQL w milczeniu zrobi powolną rzecz, gdzie sklep kv nie będzie mógł.

Jeśli nie masz zapytań o zakres, musisz umieścić indeks w jednym dokumencie, co sprawia, że ​​jego aktualizacja jest bezpieczna i oznacza, że ​​musisz pobrać cały indeks dla każdego zapytania, ponownie ograniczając skalowalność .

house:index:price -> [{"price":500000,"id":"0"},{"price":150000,"id":"1"},{"price":110000,"id":"3"},{"price":40000,"id":"2"}] 

Ale jeśli masz pytania Range (często zwane keyscans) można utworzyć indeks takiego:

house:index:price:040000 -> 2 
house:index:price:110000 -> 3 
house:index:price:150000 -> 1 
house:index:price:500000 -> 0 

A potem można żądać kluczy między house:index:price:100000 i house:index:price:: (The: znak '' to postać po "9"), a dostaniesz [3,1,0], co oznacza, że ​​wszystkie domy są droższe niż 100 000 $ (są również przydatne w kolejności). Kolejną fajną rzeczą jest to, że prawdopodobnie będą one na jednej "partycji" twojego klastra, więc to zapytanie potrwa mniej więcej tyle samo, co singe get (plus mały dodatkowy nadmiarowy transfer) lub dwa, jeśli twój zasięg się przejdzie granice serwera (ale można to zrobić równolegle!).

Pokazuje, jak wykonywać zapytania w sklepie z kv. Możesz zapytać o wszystko, co można zamówić jako ciąg (prawie wszystko) i bardzo szybko je wyszukać. Jeśli nie masz zapytań o zakres, będziesz musiał przechowywać cały indeks pod jednym kluczem, który jest do bani, ale jeśli masz zapytania o zakres, jest bardzo miły i bardzo szybki. Oto bardziej złożony przykład.

Chcę niesprzedanych domów w Toronto, które są niższe niż 100 000 USD. Po prostu muszę zaprojektować mój indeks. (Dodałem w kilku domach, aby było to bardziej znaczące). Na początku pomyślałeś, że możesz po prostu zbudować inny indeks dla każdej nieruchomości, ale szybko zrozumiesz, że to oznacza, że ​​musisz wybrać każdy niesprzedany dom i pobrać go z bazy danych. (To właśnie miałem na myśli, gdy powiedziałem, że problemy z skalowaniem są od razu oczywiste.) Rozwiązaniem jest użycie multiindeksu. Po zbudowaniu możesz wybrać dokładnie te wartości, które chcesz.

house:index:sold:city:price:f~Fooville~000010:5  -> "" 
house:index:sold:city:price:f~Toronto~040000:2   -> "" 
house:index:sold:city:price:f~Toronto~140000:4   -> "" 
house:index:sold:city:price:t~Stackoverville~500000:0 -> "" 
house:index:sold:city:price:t~The Blogosphere~110000:3 -> "" 
house:index:sold:city:price:t~Toronto~150000:1   -> "" 

Teraz, w przeciwieństwie do ostatniego przykładu, umieszczam identyfikator w kluczu. Dzięki temu dwa domy mają te same właściwości. Mogłem połączyć je w wartości, ale dodanie indeksów usuwania staje się trudniejsze. Zdecydowałem się również podzielić moje dane na ~. Dzieje się tak dlatego, że jest to leksykograficznie po wszystkich literach, zapewniając, że pełne imię i nazwisko zostanie posortowane i nie będę musiał podkładać każdego miasta na tę samą długość. W systemie produkcyjnym prawdopodobnie używałbym bajtu 255 lub 0.

Teraz zakres house:index:sold:city:price:f~Toronto~100000 - house:index:sold:city:price:f~Toronto~~ wybierze wszystkie domy pasujące do zapytania. Ważną rzeczą jest to, że kwerenda skaluje się liniowo z liczbą wyników. Oznacza to, że musisz zbudować indeks dla każdego zestawu właściwości, które chcesz indeksować (chociaż indeks w naszym przykładzie działa również w przypadku zapytań sprzedawanych i sprzedanych). To może wydawać się dużo pracy, ale w końcu zdajesz sobie sprawę, że to po prostu robisz to, a nie twoja baza danych. Jestem pewien, że zaczynamy widzieć bibliotek dla tego rodzaju rzeczy niebawem: D

Po rozciągnięciu tematu trochę, ja wykazały:

  • Niektóre zastosowania sklepie kV.
  • Jak wykonywać kwerendy w sklepie kv.

Myślę, że okaże się, że sklepy z kv są wystarczające dla wielu aplikacji i często zapewniają lepszą wydajność i dostępność niż tradycyjne RDMS. W związku z tym każda aplikacja jest inna i dlatego nie można odpowiedzieć na pierwotne pytanie.

Powiązane problemy