sql >> Database >  >> NoSQL >> Redis

Redis configureren om consequent oudere gegevens eerst te verwijderen

AFAIK, het is niet mogelijk om Redis te configureren om consequent de oudere gegevens eerst te verwijderen.

Wanneer de *-ttl of *-lru opties zijn gekozen in maxmemory-policy, gebruikt Redis geen exact algoritme om de sleutels te kiezen die moeten worden verwijderd. Een exact algoritme zou een extra lijst (voor *-lru) of een extra heap (voor *-ttl) in het geheugen vereisen, en er een kruisverwijzing naar maken met de normale Redis-woordenboekgegevensstructuur. Het zou duur zijn in termen van geheugengebruik.

Met het huidige mechanisme vinden uitzettingen plaats in de hoofdgebeurtenislus (d.w.z. potentiële uitzettingen worden gecontroleerd bij elke herhaling van de lus voordat elke opdracht wordt uitgevoerd). Totdat het geheugen weer onder de maximale geheugenlimiet is, kiest Redis willekeurig een steekproef van n sleutels en selecteert voor de vervaldatum de meest inactieve (voor *-lru) of degene die het dichtst bij de vervallimiet ligt (voor *-ttl). Standaard worden slechts 3 monsters in aanmerking genomen. Het resultaat is niet deterministisch.

Een manier om de nauwkeurigheid van dit algoritme te vergroten en het probleem te verminderen, is door het aantal beschouwde samples te verhogen (parameter maxmemory-samples in het configuratiebestand). Stel het niet te hoog in, aangezien het wat CPU verbruikt. Het is een afweging tussen de nauwkeurigheid van de uitzetting en het CPU-verbruik.

Als je echt consistent gedrag nodig hebt, is een oplossing om je eigen uitzettingsmechanisme bovenop Redis te implementeren. U kunt bijvoorbeeld een lijst toevoegen (voor sleutels die niet kunnen worden bijgewerkt) of een gesorteerde set (voor sleutels die kunnen worden bijgewerkt) om de sleutels te volgen die als eerste moeten worden verwijderd. Vervolgens voegt u een daemon toe waarvan het doel is om periodiek (met behulp van INFO) het geheugenverbruik te controleren en de items van de lijst/gesorteerde set op te vragen om de relevante sleutels te verwijderen.

Houd er rekening mee dat andere cachingsystemen hun eigen manier hebben om met dit probleem om te gaan. Bij memcached is er bijvoorbeeld één LRU-structuur per plaat (afhankelijk van de objectgrootte), dus de uitzettingsvolgorde is ook niet nauwkeurig (hoewel meer deterministisch dan bij Redis in de praktijk).




  1. Hoe kan ik alle instanties van type X in ServiceStack Redis Client wissen?

  2. Redis-concept:in geheugen of DB?

  3. mongodb krijgt verschillende records

  4. Waarom zou ik Redis gebruiken als ik PostgreSQL als mijn database voor Django heb?