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

Přetečení zásobníku, Redis a zrušení platnosti mezipaměti

Upřímně se nemohu rozhodnout, zda je to otázka SO nebo otázka MSO, ale:

Přechod na jiný systém je nikdy rychlejší než dotazování na místní paměť (pokud je klíčována); jednoduchá odpověď:používáme obojí! Takže používáme:

  • místní paměť
  • jinak zkontrolujte redis a aktualizujte místní paměť
  • jinak načíst ze zdroje a aktualizovat redis a místní paměť

To pak, jak říkáte, způsobuje problém zneplatnění mezipaměti – i když to ve skutečnosti není kritické na většině míst. Ale za tímto účelem - události redis (pub/sub) umožňují snadný způsob vysílání klíčů, které se mění všem uzlům, takže mohou zahodit svou místní kopii - což znamená:až to bude příště potřeba, vyzvedneme si novou kopii z redis . Proto vysíláme názvy klíčů, které se mění, oproti názvu kanálu jedné události.

Nástroje:redis na serveru ubuntu; BookSleeve jako obal redis; protobuf-net a GZipStream (povoleno / zakázáno automaticky v závislosti na velikosti) pro data balení.

Takže:události redis pub/sub se používají ke zneplatnění mezipaměti pro daný klíč z jedné uzel (ten, který ví, že se stav změnil) okamžitě (v podstatě) na vše uzly.

Pokud jde o odlišné procesy (z komentářů, „používáte nějaký model sdílené paměti pro více různých procesů, které využívají stejná data?“):ne, to neděláme. Každý box webové vrstvy skutečně hostuje pouze jeden proces (jakékoli dané úrovně), přičemž v rámci existuje více nájemců takže v rámci stejného procesu bychom mohli mít 70 webů. Ze starších důvodů (tj. „funguje to a nepotřebuje opravu“) primárně používáme mezipaměť http s identitou webu jako součást klíče.

Pro několik masivně datově náročných částí systému máme mechanismy pro uložení na disk, takže model v paměti lze předávat mezi po sobě jdoucími doménami aplikací, jak se web přirozeně recykluje (nebo je znovu nasazen), ale to je nesouvisející s redis.

Zde je související příklad, který ukazuje pouze širokou variantu toho, jak by to mohlo fungovat – vytvořte několik instancí následujícího a poté zadejte názvy klíčů:

static class Program
{
    static void Main()
    {
        const string channelInvalidate = "cache/invalidate";
        using(var pub = new RedisConnection("127.0.0.1"))
        using(var sub = new RedisSubscriberConnection("127.0.0.1"))
        {
            pub.Open();
            sub.Open();

            sub.Subscribe(channelInvalidate, (channel, data) =>
            {
                string key = Encoding.UTF8.GetString(data);
                Console.WriteLine("Invalidated {0}", key);
            });
            Console.WriteLine(
                    "Enter a key to invalidate, or an empty line to exit");
            string line;
            do
            {
                line = Console.ReadLine();
                if(!string.IsNullOrEmpty(line))
                {
                    pub.Publish(channelInvalidate, line);
                }
            } while (!string.IsNullOrEmpty(line));
        }
    }
}

Měli byste vidět, že když napíšete název klíče, okamžitě se zobrazí ve všech spuštěných instancích, které pak vypíší místní kopii tohoto klíče. Je zřejmé, že při skutečném použití by bylo nutné tato dvě připojení někam umístit a udržovat otevřená, takže ne být v using prohlášení. K tomu používáme téměř jeden jediný.




  1. Použití více databází Mongodb s Meteor.js

  2. Vytvořte jedinečné pole automatického přírůstku pomocí mangusty

  3. Nelze vytvořit/otevřít soubor zámku:/data/mongod.lock errno:13 Oprávnění odepřeno

  4. Konfigurace Laravel Redis