sql >> Databasteknik >  >> NoSQL >> Redis

Konfigurera redis för att konsekvent avhysa äldre data först

AFAIK, det är inte möjligt att konfigurera Redis för att konsekvent kasta ut äldre data först.

När *-ttl eller *-lru alternativen väljs i maxmemory-policy, använder inte Redis en exakt algoritm för att välja nycklarna som ska tas bort. En exakt algoritm skulle kräva en extra lista (för *-lru) eller en extra hög (för *-ttl) i minnet, och korsreferens den med den normala Redis-ordbokens datastruktur. Det skulle bli dyrt med tanke på minnesförbrukning.

Med den nuvarande mekanismen inträffar vräkningar i huvudhändelsslingan (dvs potentiella vräkningar kontrolleras vid varje loopiteration innan varje kommando exekveras). Tills minnet är tillbaka under maxminnesgränsen, plockar Redis slumpmässigt ett urval av n nycklar och väljer för utgång den mest lediga (för *-lru) eller den som är närmast dess utgångsgräns (för *-ttl). Som standard beaktas endast 3 prover. Resultatet är icke deterministiskt.

Ett sätt att öka noggrannheten hos denna algoritm och mildra problemet är att öka antalet övervägda prover (maxmemory-samples-parametern i konfigurationsfilen). Sätt inte den för högt, eftersom den kommer att förbruka en del CPU. Det är en avvägning mellan eviction-noggrannhet och CPU-förbrukning.

Om du verkligen behöver ett konsekvent beteende är en lösning att implementera din egen vräkningsmekanism ovanpå Redis. Till exempel kan du lägga till en lista (för icke-uppdateringsbara nycklar) eller en sorterad uppsättning (för uppdateringsbara nycklar) för att spåra nycklarna som ska vräkas först. Sedan lägger du till en demon vars syfte är att regelbundet kontrollera (med hjälp av INFO) minnesförbrukningen och fråga objekten i listan/sorterade uppsättningen för att ta bort relevanta nycklar.

Observera att andra cachningssystem har sina egna sätt att hantera detta problem. Till exempel med memcached finns det en LRU-struktur per platta (vilket beror på objektets storlek), så vräkningsordningen är inte heller korrekt (även om mer deterministisk än med Redis i praktiken).




  1. få aktuellt datum och tid i lua in redis

  2. Anslutning vägrade för Redis på Heroku

  3. MongoDB $ltrim

  4. Steg för att ansluta MongoDB och Solr med DataImportHandler