sql >> Databasteknik >  >> NoSQL >> Redis

Prestanda för Redis vs Disk i cacheapplikation

Detta är en jämförelse mellan äpplen och apelsiner. Se http://redis.io/topics/benchmarks

Redis är en effektiv fjärrkontroll datalagring. Varje gång ett kommando körs på Redis skickas ett meddelande till Redis-servern och om klienten är synkron blockerar den väntan på svar. Så utöver kostnaden för själva kommandot kommer du att betala för en nätverksresa tur och retur eller en IPC.

På modern hårdvara är nätverksresor eller IPC:er förvånansvärt dyra jämfört med andra operationer. Detta beror på flera faktorer:

  • mediets obearbetade latens (främst för nätverk)
  • latensen för operativsystemets schemaläggare (inte garanterad på Linux/Unix)
  • minnescachemissar är dyra, och sannolikheten för cachemissar ökar medan klient- och serverprocesserna schemaläggs in/ut.
  • på avancerade lådor, NUMA biverkningar

Låt oss nu granska resultaten.

Om man jämför implementeringen med generatorer och den som använder funktionsanrop, genererar de inte samma antal tur och retur till Redis. Med generatorn har du helt enkelt:

    while time.time() - t - expiry < 0:
        yield r.get(fpKey)

Alltså 1 tur och retur per iteration. Med funktionen har du:

if r.exists(fpKey):
    return r.get(fpKey)

Alltså 2 tur och retur per iteration. Inte konstigt att generatorn är snabbare.

Naturligtvis är det meningen att du ska återanvända samma Redis-anslutning för optimal prestanda. Det är ingen idé att köra ett benchmark som systematiskt kopplar/kopplar bort.

Slutligen, när det gäller prestandaskillnaden mellan Redis-samtal och filläsningen, jämför du helt enkelt ett lokalt samtal med ett fjärrsamtal. Filläsningar cachelagras av OS-filsystemet, så de är snabba minnesöverföringsoperationer mellan kärnan och Python. Det finns ingen disk I/O inblandad här. Med Redis måste du betala för kostnaden för tur och retur, så det går mycket långsammare.




  1. MongoDB 2.1 Aggregate Framework Summa av matriselement som matchar ett namn

  2. Mongoose skriver över dokumentet snarare än `$set`-fält

  3. Att använda findOne i en loop tar för lång tid i Node.js

  4. Redis aktiv-aktiv replikering