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

Proč nevyprší platnost klíčů Redis?

Edit:Nyní s aktualizovaným kódem se domnívám, že vaše metodika je zásadně chybná kromě toho, co uvádíte.

Způsob, jakým jste to implementovali, vyžaduje spuštění KEYS ve výrobě - ​​to je špatné. Jak budete škálovat, způsobíte rostoucí a zbytečnou zátěž blokující systém na serveru. Jak říká každá část dokumentace, nedělejte to použijte keys ve výrobě. Všimněte si, že kódování doby vypršení platnosti v názvu klíče vám nepřináší žádnou výhodu. Pokud byste z této části názvu klíče udělali časové razítko vytvoření nebo dokonce náhodné číslo, nic by se nezměnilo. Pokud byste tento bit odstranili, nic by se nezměnilo.

Rozumnější cestou by místo toho bylo použití názvu klíče, který není časově závislý. Použití expirace tuto funkci řeší za vás. Nazvěme vaši věc s omezenou sazbou „relace“. Název vašeho klíče bez časového razítka je „ID relace“. Nastavením expirace na 60s již nebude k dispozici u značky 61s. Takže můžete bezpečně zvyšovat a porovnávat výsledek se svým limitem, aniž byste potřebovali znát aktuální čas nebo dobu vypršení platnosti. Vše, co potřebujete, je název statického klíče a na něm nastavená vhodná doba platnosti.

Pokud INCR neexistující klíč, Redis vrátí "1", což znamená, že vytvořil klíč a zvýšil jej v jediném kroku/volání. takže v podstatě logika vypadá takto:

  1. vytvořit ID "relace"
  2. počítadlo zvýšení pomocí ID
  3. porovnat výsledek s limitem
    1. pokud počet ==1, nastavte expiraci na 60 s
    2. počet ID> omezit, odmítnout

Krok 3.1 je důležitý. Počet 1 znamená, že se jedná o nový klíč v Redis a chcete u něj nastavit dobu platnosti. Cokoli jiného znamená, že vypršení platnosti již mělo být nastaveno. Pokud jej nastavíte ve verzi 3.2, přerušíte proces, protože zachová počítadlo déle než 60 s.

Díky tomu nemusíte mít dynamické názvy klíčů založené na době vypršení platnosti, a proto nemusíte používat keys zjistit, zda pro objekt s omezenou sazbou existuje „relace“. Díky tomu je váš kód mnohem jednodušší a předvídatelnější a také se omezí zpáteční cesty do Redis – což znamená, že bude nižší zatížení Redis a lepší výkon. Pokud jde o to, jak to udělat s klientskou knihovnou, kterou používáte, nemohu říci, protože s ní nejsem tak obeznámen. Ale základní sekvence by do ní měla být přeložitelná, protože je poměrně základní a jednoduchá.

Co jste však neukázali, je cokoliv, co by podpořilo tvrzení, že k expiraci nedochází. Vše, co jste udělali, je ukázat, že Redis je skutečně řečeno, a nastavit expiraci. Abyste podpořili svůj nárok, musíte prokázat, že platnost klíče nevypršela. Což znamená, že musíte ukázat načtení klíče po uplynutí doby platnosti a že počítadlo nebylo „resetováno“ tím, že bylo po vypršení platnosti znovu vytvořeno. Jedním ze způsobů, jak můžete vidět vypršení platnosti, je použití upozornění na klíčový prostor. Díky tomu budete moci vidět, jak Redis říká, že platnost klíče vypršela.

Tam, kde tento proces trochu selže, je situace, kdy pro omezení rychlosti použijete více oken, nebo pokud máte mnohem větší okno (tj. 10 minut), v takovém případě mohou být setříděné sady rozumnější možností, jak zabránit načítání požadavků předem. - je-li to žádoucí. Ale jak je napsán váš příklad, výše uvedené bude fungovat dobře.




  1. Nelze se připojit k serveru 127.0.0.1:27017

  2. Jak uložit a načíst řetězec s diakritikou v redis?

  3. Zkopírujte/klonujte databázi v MongoDB

  4. Jak sloučit dokumenty při importu souboru do MongoDB