|
Applicaties ontwikkelen met Redis is een prettig proces, maar zoals bij elke technologie zijn er een paar dingen waar je rekening mee moet houden bij het ontwerpen van Redis-gebaseerde applicaties. Je was misschien al bekend met de hele routine van relationele databaseontwikkeling, en applicatieontwikkeling op Redis vertoont veel overeenkomsten, maar je moet rekening houden met de volgende twee dingen - Redis is een in-memory database en is single-threaded. Daarom moet je bij het gebruik van Edis op de volgende punten letten: 1. Beheers alle toetsen die in Redis zijn opgeslagen De belangrijkste functie van een database is het opslaan van data, maar het is normaal dat ontwikkelaars sommige opgeslagen gegevens in de database negeren vanwege veranderingen in applicatievereisten of datagebruiksmethoden, en hetzelfde geldt voor Redis. Je kunt bepaalde sleutels over het hoofd zien die verlopen, of je vergeet de data omdat een module van je applicatie verouderd is. In beide gevallen slaat Redis sommige data op die niet meer in gebruik is, waardoor het zonder reden wat ruimte inneemt. Het zwak gestructureerde datapatroon van Redis maakt het moeilijk om te achterhalen wat er centraal wordt opgeslagen, tenzij je een zeer volwassen nomenclatuur voor sleutels gebruikt. Het gebruik van de juiste naamgevingsmethode vereenvoudigt je databasebeheer, en wanneer je via je applicatie of dienst een naamruimte voor sleutels aanmaakt (meestal met dubbele punten om sleutelnamen te scheiden), kun je gemakkelijk gegevens identificeren bij het migreren, converteren of verwijderen ervan. Een ander veelvoorkomend gebruiksscenario voor Redis is als tweede dataopslag voor hot data items, waarbij het merendeel van de data wordt opgeslagen in andere databases, zoals PostgreSQL of MongoDB. In deze gebruiksgevallen vergeten ontwikkelaars vaak de bijbehorende gegevens in Redis te verwijderen wanneer data uit de primaire opslag wordt verwijderd. In dit geval is cascadeverwijdering meestal vereist, in welk geval dit kan worden bereikt door alle identificaties van een specifiek gegevensitem in de Redis-configuratie op te slaan, zodat na het verwijderen van de gegevens in de primaire database een schoonmaker wordt ingeschakeld om alle relevante kopieën en informatie te verwijderen. 2. Beheersen de lengte van alle sleutelnamen Zoals hierboven al zeiden, hebben we passende naamgevingsconventies gebruikt en voorvoegsels toegevoegd om aan te geven waar de data naartoe gaat, dus dit lijkt daar tegenin te gaan. Vergeet echter niet dat Redis een in-memory database is, en hoe korter de sleutels, hoe minder ruimte je nodig hebt. Natuurlijk heeft de lengte van de sleutelnaam een grote impact wanneer er miljoenen of miljarden sleutels in een database staan. Bijvoorbeeld, op een 32-bit Redis-server, als je een miljoen sleutels opslaat met een lengte van 32 tekens, neemt het ongeveer 96MB ruimte in bij gebruik van een sleutelnaam van 6 tekens, maar als je een sleutelnaam van 12 tekens gebruikt, zal het ruimteverbruik stijgen tot ongeveer 111MB. Met meer sleutels zal de extra 15% overhead een aanzienlijke impact hebben. 3. Gebruik de juiste datastructuur Of het nu gaat om geheugengebruik of prestaties, soms kunnen datastructuren een grote impact hebben, hier zijn enkele best practices om op terug te vallen: In plaats van data op te slaan als duizenden (of miljoenen) afzonderlijke strings, overweeg het gebruik van gehashte datastructuren om gerelateerde data te groeperen. Hashtabellen zijn zeer efficiënt en kunnen je geheugengebruik verminderen; Tegelijkertijd is hashing ook gunstiger voor detailabstractie en codeleesbaarheid. Gebruik waar passend lijst in plaats van set. Als je de setfunctie niet nodig hebt, kan List snellere snelheden bieden dan de set met minder geheugen. Gesorteerde sets zijn de duurste datastructuren, zowel qua geheugenverbruik als qua complexiteit van basisbewerkingen. Als je alleen een manier nodig hebt om records te bevragen en je geeft niet om het sorteren van zulke eigenschappen, dan wordt het sterk aanbevolen om hashtabellen te gebruiken. Een vaak over het hoofd geziene functie in Redis zijn bitmaps of bitsets (na V2.2). Bitsets stellen je in staat om meerdere bitniveaubewerkingen uit te voeren op Redis-waarden, zoals een lichtgewicht analyse. 4. Gebruik de sleutel niet bij het gebruik van SCAN Vanaf Redis v2.8 is het SCAN-commando al beschikbaar, waarmee sleutels via de cursor uit de sleutelruimte kunnen worden opgehaald. In vergelijking met het KEYS-commando, hoewel SCAN niet alle overeenkomende resultaten tegelijk kan teruggeven, voorkomt het het hoge risico van het blokkeren van het systeem, zodat sommige bewerkingen op de masternode kunnen worden uitgevoerd. Het is belangrijk om te weten dat het SCAN-commando een cursor-gebaseerde iterator is. Elke keer dat het SCAN-commando wordt aangeroepen, wordt een nieuwe cursor teruggegeven aan de gebruiker, en de gebruiker moet deze nieuwe cursor als cursorparameter van het SCAN-commando gebruiken in de volgende iteratie, om het vorige iteratieproces voort te zetten. Tegelijkertijd kunnen gebruikers met SCAN ook commando's aanpassen met toetsnaammodus en telopties. SCAN-gerelateerde commando's omvatten ook SSCAN-commando's, HSCAN-commando's en ZSCAN-commando's, die respectievelijk worden gebruikt voor verzamelingen, hash-sleutels en sequels. 5. Gebruik server-side Lua-scripts Tijdens het gebruik van Edis biedt de ondersteuning van Lua-scripts ontwikkelaars ongetwijfeld een zeer gebruiksvriendelijke ontwikkelomgeving, waardoor de creativiteit van gebruikers sterk wordt bevrijd. Wanneer ze correct worden gebruikt, kunnen Lua-scripts aanzienlijke verbeteringen brengen in prestaties en resourceverbruik. In plaats van data aan de CPU door te geven, stellen scripts je in staat om logica uit te voeren die het dichtst bij de data ligt, waardoor de netwerklatentie en de redundante dataoverdracht wordt verminderd. In Redis is een zeer klassiek gebruiksscenario voor Lua het filteren of aggregeren van data in een applicatie. Door de verwerkingsworkflow in een script te verpakken, kun je het eenvoudig aanroepen om een kleiner antwoord te krijgen met weinig middelen en minder tijd. Pro tip:Lua is geweldig, maar heeft ook wat problemen, zoals moeite met het rapporteren en oplossen van bugs. Een slimme aanpak is om de Pub/Sub-functie van Reeds te gebruiken en het script logberichten te laten sturen via een speciaal kanaal. Maak vervolgens een abonneeproces aan en verwerk dit dienovereenkomstig.
|