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

Je Redis jen cache?

Ne, Redis je mnohem víc než jen cache.

Stejně jako mezipaměť ukládá Redis páry klíč=hodnota. Ale na rozdíl od mezipaměti vám Redis umožňuje pracovat s hodnotami. V Redis je 5 datových typů – řetězce, sady, hash, seznamy a tříděné sady. Každý datový typ zpřístupňuje různé operace.

Nejlepší způsob, jak porozumět Redis, je modelovat aplikaci, aniž byste přemýšleli o tom, jak ji uložíte do databáze.

Řekněme, že chceme vybudovat StackOverflow.com. Aby to bylo jednoduché, potřebujeme otázky, odpovědi, značky a uživatele.

Modelovací otázky, uživatelé a odpovědi

Každý objekt lze modelovat jako mapu. Například otázka je mapa s poli {id, title, date_asked, votes, ask_by, status}. Podobně odpověď je mapa s poli {id, question_id, answer_text, answer_by, votes, status}. Podobně můžeme modelovat uživatelský objekt.

Každý z těchto objektů může být přímo uložen v Redis jako hash. Chcete-li vygenerovat jedinečná ID, můžete použít příkaz atomic increment. Něco takového -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Zpracování hlasů

Pokaždé, když někdo schválí otázku nebo odpověď, stačí to udělat

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Seznam otázek pro domovskou stránku

Dále chceme uložit nejnovější otázky, které se zobrazí na domovské stránce. Pokud byste psali program .NET nebo Java, ukládali byste otázky do seznamu. Ukázalo se, že je to nejlepší způsob, jak to uložit také v Redis.

Pokaždé, když někdo položí otázku, přidáme jeho id do seznamu.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Nyní, když chcete vykreslit svou domovskou stránku, zeptáte se Redis na posledních 25 otázek.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Nyní, když máte ID, načtěte položky z Redis pomocí zřetězení a ukažte je uživateli.

Otázky podle značek, seřazené podle hlasů

Dále chceme načíst otázky pro každou značku. Ale SO vám umožňuje vidět otázky s nejvyšším hlasováním, nové otázky nebo nezodpovězené otázky pod každým štítkem.

K modelování používáme funkci Redis's Sorted Set. Tříděná sada vám umožňuje přiřadit skóre ke každému prvku. Poté můžete načíst prvky na základě jejich skóre.

Pojďme to udělat pro značku Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

Co jsme tady dělali? Do seřazené sady jsme přidali otázky a ke každé otázce jsme přiřadili skóre (počet hlasů). Pokaždé, když otázka získá kladné hodnocení, zvýšíme její skóre. A když uživatel klikne na „Otázky označené Redis, seřazené podle hlasů“, provedeme pouze zrevrange a získejte zpět hlavní otázky.

Otázky v reálném čase bez obnovování stránky

A nakonec bonusová funkce. Pokud necháte stránku otázek otevřenou, SO vás upozorní, když bude přidána nová otázka. Jak tady může Redis pomoci?

Redis má model pub-sub. Můžete vytvořit kanály, například "channel_questions_tagged_redis". Poté se subscribe uživatelů na konkrétní kanál. Když je přidána nová otázka, publish zprávu na tento kanál. Všichni uživatelé pak obdrží zprávu. Ke skutečnému doručení zprávy do prohlížeče budete muset použít webovou technologii, jako jsou webové zásuvky nebo kometa, ale Redis vám pomůže se všemi instalacemi na straně serveru.

Vytrvalost, spolehlivost atd.

Na rozdíl od mezipaměti uchovává Redis data na pevném disku. Pro zajištění lepší spolehlivosti můžete mít nastavení master-slave. Chcete-li se dozvědět více, projděte si témata Persistence a replikace zde - http://redis.io/documentation



  1. Jak mohu implementovat tuto jedinou souběžně distribuovanou frontu v jakékoli platformě MQ?

  2. Redis:Zobrazit velikost/velikost databáze pro klíče

  3. redis paměti a cpu špičky

  4. Mongoid nebo MongoMapper?