Bewerken:Nu met de bijgewerkte code geloof ik dat uw methodologie fundamenteel gebrekkig is, afgezien van wat u rapporteert.
De manier waarop u het heeft geïmplementeerd, vereist het uitvoeren van KEYS
in productie - dit is slecht. Naarmate u uitschaalt, veroorzaakt u een groeiende en onnodige systeemblokkerende belasting op de server. Zoals elk stukje documentatie erop zegt, doe niet gebruik keys
in de maak. Houd er rekening mee dat het coderen van de vervaltijd in de sleutelnaam geen voordeel oplevert. Als je dat deel van de sleutelnaam een tijdstempel voor het maken had gemaakt, of zelfs een willekeurig getal, zou er niets veranderen. Inderdaad, als je dat stukje zou verwijderen, zou er niets veranderen.
Een meer verstandige route zou in plaats daarvan zijn om een sleutelnaam te gebruiken die niet tijdsafhankelijk is. Het gebruik van expiratie regelt die functie voor u. Laten we uw tariefbeperkte ding een "sessie" noemen. Uw sleutelnaam zonder tijdstempel is de "sessie-ID". Door er een vervaldatum van 60s op in te stellen, zal deze niet meer beschikbaar zijn op het 61s-teken. U kunt het resultaat dus veilig verhogen en vergelijken met uw limiet zonder dat u de huidige tijd of vervaltijd hoeft te weten. Het enige dat u nodig hebt, is een statische sleutelnaam en een geschikte vervaldatum erop.
Als u INCR
een niet-bestaande sleutel, zal Redis "1" retourneren, wat betekent dat het de sleutel heeft gemaakt en deze in een enkele stap/aanroep heeft verhoogd. dus eigenlijk gaat de logica als volgt:
- maak "sessie"-ID
- teller verhogen met ID
- vergelijk resultaat met limiet
- if count ==1, vervaldatum instellen op 60s
- aantal ID's> beperken, weigeren
Stap 3.1 is belangrijk. Een telling van 1 betekent dat dit een nieuwe sleutel is in Redis en dat u uw vervaldatum erop wilt instellen. Al het andere betekent dat de vervaldatum al had moeten zijn ingesteld. Als je het in 3.2 instelt, onderbreek je het proces omdat het de teller langer dan 60 seconden bewaart.
Hiermee hoeft u geen dynamische sleutelnamen te hebben op basis van vervaltijd, en hoeft u dus geen keys
te gebruiken om uit te zoeken of er een bestaande "sessie" is voor het object met beperkte snelheid. Het maakt uw code ook veel eenvoudiger en voorspelbaarder, en vermindert de retourvluchten naar Redis, wat betekent dat Redis minder wordt belast en beter presteert. Hoe je dat moet doen met de clientbibliotheek die je gebruikt, kan ik niet zeggen omdat ik er niet zo bekend mee ben. Maar de basisreeks zou ernaar moeten kunnen worden vertaald omdat het vrij eenvoudig en eenvoudig is.
Wat u echter niet hebt laten zien, is iets dat de bewering ondersteunt dat de expiratie niet plaatsvindt. Het enige wat je hebt gedaan, is laten zien dat Redis inderdaad wordt verteld en een vervaldatum instellen. Ter onderbouwing van uw claim dient u aan te tonen dat de sleutel niet verloopt. Wat betekent dat u moet laten zien dat de sleutel na de vervaltijd is opgehaald en dat de teller niet is "gereset" door opnieuw te worden gemaakt na de expiratie. Een manier waarop u kunt zien dat de vervaldatum plaatsvindt, is door keyspace-meldingen te gebruiken. Daarmee kun je Redis zien zeggen dat een sleutel is verlopen.
Waar dit proces een beetje zal mislukken, is als je meerdere vensters gebruikt voor snelheidsbeperking, of als je een veel groter venster hebt (dwz 10 minuten), in welk geval gesorteerde sets een verstandiger optie kunnen zijn om te voorkomen dat verzoeken vooraf worden geladen - indien gewenst. Maar zoals uw voorbeeld is geschreven, zal het bovenstaande prima werken.