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

Jak efektivně vložit miliardu dat do Redis?

Několik bodů týkajících se otázky a ukázkového kódu.

  1. Pipelining není stříbrná kulka - musíte pochopit, co dělá, než jej použijete. Zřetězení dělá dávkové několik operací, které se odesílají hromadně, stejně jako jejich odpověď ze serveru. Získáte tím, že doba zpětného odpojení sítě pro každou operaci je nahrazena časem dávky. Ale nekonečně velké dávky jsou skutečným vyčerpáním zdrojů – je třeba udržovat jejich velikost dostatečně malou, aby byla efektivní. Obvykle se snažím cílit na 60 kB na kanál, a protože každá data se liší, liší se i počet skutečných operací v potrubí. Za předpokladu, že váš klíč a jeho hodnota jsou ~1KB, musíte zavolat pipeline.execute() každých 60 operací nebo tak.

  2. Pokud to hrubě nepochopím, tento kód by se neměl spustit. Používáte HMSET jako by to bylo SET , takže vám v podstatě chybí mapování pole->hodnoty hashů. Hash (HMSET ) a Řetězce (SET ) jsou různé datové typy, a proto by se měly používat odpovídajícím způsobem.

  3. Zdá se, jako by tato malá smyčka měla na starosti celou „miliardu dat“ – pokud je tomu tak, nejenže by váš server, na kterém běží kód, swapoval jako blázen, pokud by neměl hodně paměti RAM pro uložení slovníku, bylo by to také velmi neúčinné (bez ohledu na rychlost Pythonu). Musíte paralelizovat vkládání dat spuštěním více instancí tohoto procesu.

  4. Připojujete se k Redis vzdáleně? Pokud ano, síť může omezovat váš výkon.

  5. Zvažte nastavení vašeho Redis – možná je lze upravit/vyladit pro lepší výkon pro tento úkol, za předpokladu, že jde skutečně o úzké hrdlo.



  1. Nastavení připojení singleton s node.js a mongo

  2. Objekt MongoDB serializovaný jako JSON

  3. Jak vytvořit RedisCacheManager v spring-data 2.0.x

  4. mongodb se nemohl připojit k serveru