sql >> Databáze >  >> NoSQL >> Redis

Jaké jsou základní datové struktury používané pro Redis?

Pokusím se odpovědět na vaši otázku, ale začnu něčím, co může na první pohled vypadat divně:pokud vás nezajímají vnitřnosti Redis, nemělo by vám to být jedno o tom, jak jsou datové typy interně implementovány. Je to z prostého důvodu:pro každou operaci Redis najdete časovou složitost v dokumentaci, a pokud máte sadu operací a časovou složitost, jediná další věc, kterou potřebujete, je nějaké vodítko o využití paměti (a protože provádíme mnoho optimalizací, které se mohou lišit v závislosti na datech. Nejlepším způsobem, jak získat tato poslední čísla, je provést několik triviálních testů v reálném světě).

Ale protože jste se zeptali, zde je základní implementace každého datového typu Redis.

  • Řetězce jsou implementovány pomocí knihovny dynamických řetězců C, takže neplatíme (asymptoticky řečeno) za alokace v operacích připojení. Tímto způsobem máme například připojení O(N), namísto kvadratického chování.
  • Seznamy jsou implementovány s propojenými seznamy.
  • Sady a Hashes jsou implementovány pomocí hashovacích tabulek.
  • Seřazené sady jsou implementovány pomocí seznamů přeskakování (zvláštní typ vyvážených stromů).

Ale když jsou seznamy, sady a seřazené sady malé co do počtu položek a velikosti největších hodnot, použije se jiné, mnohem kompaktnější kódování. Toto kódování se u různých typů liší, ale má tu vlastnost, že jde o kompaktní blob dat, který si často vynucuje skenování O(N) pro každou operaci. Protože tento formát používáme pouze pro malé objekty, není to problém; skenování malého blobu O(N) nezapomíná na mezipaměť takže prakticky vzato je to velmi rychlé, a když je prvků příliš mnoho, kódování se automaticky přepne na nativní kódování (propojený seznam, hash atd.).

Ale vaše otázka se ve skutečnosti netýkala jen vnitřních věcí, vaším cílem bylo Jaký typ použít k dosažení čeho? .

Řetězce

Toto je základní typ všech typů. Je to jeden ze čtyř typů, ale je také základním typem komplexních typů, protože Seznam je seznam řetězců, Sada je sada řetězců a tak dále.

Řetězec Redis je dobrý nápad ve všech zřejmých scénářích, kdy chcete uložit stránku HTML, ale také když se chcete vyhnout převodu již zakódovaných dat. Takže například, pokud máte JSON nebo MessagePack, můžete pouze ukládat objekty jako řetězce. V Redis 2.6 můžete dokonce manipulovat s tímto typem strany objektového serveru pomocí skriptů Lua.

Dalším zajímavým využitím řetězců jsou bitmapy a obecně pole bajtů s náhodným přístupem, protože Redis exportuje příkazy pro přístup k náhodným rozsahům bajtů nebo dokonce k jednotlivým bitům. Podívejte se například na tento dobrý blogový příspěvek:Rychlé snadné metriky v reálném čase pomocí Redis.

Seznamy

Seznamy jsou dobré, když se pravděpodobně dotknete pouze krajních částí seznamu:u ocasu nebo u hlavy. Seznamy nejsou příliš vhodné pro stránkování věcí, protože náhodný přístup je pomalý, O(N). Dobrým využitím seznamů jsou tedy obyčejné fronty a zásobníky nebo zpracování položek ve smyčce pomocí RPOPLPUSH se stejným zdrojem a cílem pro „otočení“ kruhu. položek.

Seznamy jsou také dobré, když chceme pouze vytvořit omezenou kolekci N položek, kde obvykle máme přístup pouze k horním nebo dolním položkám, nebo když je N malé.

Sady

Sady jsou neuspořádanou sbírkou dat, takže jsou dobré pokaždé, když máte sbírku položek, a je velmi důležité velmi rychle zkontrolovat existenci nebo velikost sbírky. Další skvělá věc na sadách je podpora pro prohlížení nebo vyskakování náhodných prvků (příkazy SRANDMEMBER a SPOP).

Množiny jsou také vhodné k reprezentaci vztahů, např. "Co jsou přátelé uživatele X?" a tak dále. Ale další dobré datové struktury pro tento druh věcí jsou tříděné sady, jak uvidíme.

Sady podporují složité operace, jako jsou průniky, sjednocení a tak dále, takže toto je dobrá datová struktura pro použití Redis „výpočetním“ způsobem, když máte data a chcete na těchto datech provádět transformace, abyste získali nějaký výstup.

Malé sady jsou kódovány velmi efektivním způsobem.

Haše

Hash je perfektní datová struktura pro reprezentaci objektů, složená z polí a hodnot. Pole hashů lze také atomicky inkrementovat pomocí HINCRBY. Když máte objekty, jako jsou uživatelé, příspěvky na blogu nebo jiný druh položky Pokud nechcete používat vlastní kódování, jako je JSON nebo podobné, pravděpodobně jsou hashe správnou cestou.

Mějte však na paměti, že Redis velmi efektivně kóduje malé hashe a můžete požádat Redis, aby atomicky GET, SET nebo inkrementoval jednotlivá pole velmi rychlým způsobem.

Hash lze také použít k reprezentaci propojených datových struktur pomocí odkazů. Zkontrolujte například implementaci komentářů na webu lamernews.com.

Seřazené sady

Seřazené množiny jsou jedinými dalšími datovými strukturami, kromě seznamů, k udržení uspořádaných prvků . S roztříděnými sadami můžete dělat řadu skvělých věcí. Můžete mít například všechny druhy Nejlepších věcí seznamy ve vaší webové aplikaci. Nejlepší uživatelé podle skóre, nejlepší příspěvky podle zobrazení stránek, nejlepší cokoli, ale jedna instance Redis bude podporovat spoustu operací vkládání a získávání top prvků za sekundu.

Seřazené množiny, stejně jako běžné množiny, lze použít k popisu vztahů, ale také umožňují stránkování seznamu položek a zapamatování si pořadí. Pokud si například pamatuji přátele uživatele X se seřazenou sadou, mohu si je snadno zapamatovat v pořadí přijatého přátelství.

Seřazené sady jsou vhodné pro prioritní fronty.

Seřazené sady jsou jako výkonnější seznamy, kde je vkládání, odebírání nebo získávání rozsahů ze středu seznamu vždy rychlé. Ale využívají více paměti a jsou to datové struktury O(log(N)).

Závěr

Doufám, že jsem v tomto příspěvku poskytl nějaké informace, ale mnohem lepší je stáhnout si zdrojový kód lamernews z http://github.com/antirez/lamernews a pochopit, jak to funguje. V Lamer News se používá mnoho datových struktur z Redis a existuje mnoho vodítek o tom, co použít k vyřešení daného úkolu.

Omlouvám se za gramatické překlepy, je tady půlnoc a příliš unavená na to, abych si příspěvek prohlédla;)



  1. Redis vs Service Bus pro scénář pub/sub

  2. Jak se připojit ke clusteru ElastiCache pomocí node.js

  3. Skript se pokusil vytvořit globální proměnnou

  4. Nodejs, nečeká na dokončení dotazu Redis, než bude pokračovat v provádění