Hoe Redis-databases en sleutels te beheren

Introductie

Redis is een open-source, in-memory key-value data store. Een key-value-dataopslag is een type NoSQL-database waarin keys dienen als unieke identificatoren voor hun bijbehorende values. Elke Redis-instantie bevat een aantal databases, elk daarvan kan veel verschillende keys van verschillende datatypes bevatten.

In deze tutorial leer je hoe je een database selecteert, keys tussen databases verplaatst en keys beheert en verwijdert.

Hoe je deze handleiding kunt gebruiken

Deze handleiding is geschreven als een spiekbriefje met op zichzelf staande voorbeelden. We raden je aan naar een willekeurige sectie te springen die relevant is voor de taak die je probeert uit te voeren.

De commando’s die in deze handleiding worden weergegeven, zijn getest op een Ubuntu 22.04-server met Redis-versie 6.0.16. Om een vergelijkbare omgeving op te zetten, kunt u Stap 1 volgen in onze handleiding over Hoe Redis te installeren en beveiligen op Ubuntu 22.04. We zullen demonstreren hoe deze commando’s zich gedragen door ze uit te voeren met redis-cli, de command-line interface van Redis. Merk op dat als u een andere Redis-interface gebruikt, zoals Redli, de exacte uitvoer van bepaalde commando’s kan verschillen.

Als alternatief kunt u een beheerde Redis-database-instantie provisioneren om deze commando’s te testen, maar afhankelijk van het niveau van controle dat uw databaseprovider toestaat, werken sommige commando’s in deze handleiding mogelijk niet zoals beschreven. Volg voor het provisioneren van een DigitalOcean Managed Database onze documentatie voor beheerde databases. Vervolgens moet u Redli installeren of een TLS-tunnel opzetten om verbinding te maken met de beheerde database via TLS.

Beheer van databases

Standaard ondersteunt een Redis-instantie 16 logische databases. Deze databases zijn effectief van elkaar gescheiden, en wanneer je een opdracht uitvoert in één database, heeft dit geen invloed op de gegevens die zijn opgeslagen in andere databases in je Redis-instantie.

Redis-databases zijn genummerd van 0 tot 15 en bij het verbinden met je Redis-instantie maak je standaard verbinding met database 0. Je kunt echter de database wijzigen die je gebruikt met het select-commando nadat je verbinding hebt gemaakt:

  1. select 15

Als je een andere database hebt geselecteerd dan 0, wordt dit weergegeven in de redis-cli-prompt:

Om alle gegevens in één database te verwisselen met de gegevens in een andere, gebruik je het swapdb-commando. Het volgende voorbeeld zal de gegevens in database 6 verwisselen met de gegevens in database 8, en alle clients die verbonden zijn met een van beide databases kunnen onmiddellijk wijzigingen implementeren:

  1. swapdb 6 8

swapdb geeft OK terug als de verwisseling succesvol is.

Als je een sleutel naar een andere Redis-instantie wilt verplaatsen, kun je migrate uitvoeren. Dit commando zorgt ervoor dat de sleutel op de doelinstantie bestaat voordat deze van de broninstantie wordt verwijderd. Bij het uitvoeren van migrate moet het commando de volgende elementen in deze volgorde bevatten:

  • De hostnaam of het IP-adres van de doeldatabase
  • Het poortnummer van de doeldatabase
  • De naam van de sleutel die je wilt migreren
  • Het databasenummer waar je de sleutel op de doelinstantie wilt opslaan
  • A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time

Ter illustratie, hier is een voorbeeld:

  1. migrate 203.0.113.0 6379 key_1 7 8000

Bovendien biedt migrate de volgende opties die je kunt toevoegen na het timeout-argument:

  • COPY: Geeft aan dat de sleutel niet moet worden verwijderd van de broninstantie
  • REPLACE: Geeft aan dat als de sleutel al bestaat op de bestemmingsinstantie, de migrate-bewerking deze moet verwijderen en vervangen
  • KEYS: In plaats van een specifieke sleutel op te geven om te migreren, kun je een lege tekenreeks invoeren ("") en vervolgens de syntaxis van het keys-commando gebruiken om elke sleutel te migreren die overeenkomt met een patroon. Voor meer informatie over hoe keys werkt, lees onze tutorial over Hoe Problemen in Redis Op te Lossen.

Beheer van Sleutels

Er zijn verschillende Redis-commando’s die handig zijn voor het beheren van sleutels, ongeacht welk type gegevens ze bevatten. Enkele van deze commando’s worden besproken in de volgende sectie.

rename hernoemt de opgegeven sleutel. Als het succesvol is, wordt OK geretourneerd:

  1. rename old_key new_key

Je kunt randomkey gebruiken om een willekeurige sleutel uit de momenteel geselecteerde database te retourneren:

  1. randomkey
Output
"any_key"

Gebruik type om te bepalen welk type gegevens de opgegeven sleutel bevat. De uitvoer van deze opdracht kan zijn string, list, hash, set, zset of stream:

  1. type key_1
Output
"string"

Als de opgegeven sleutel niet bestaat, geeft type in plaats daarvan none terug.

U kunt een individuele sleutel naar een andere database in uw Redis-instantie verplaatsen met de move-opdracht. move neemt de naam van een sleutel en de database waar u de sleutel naartoe wilt verplaatsen als argumenten. Bijvoorbeeld, om de sleutel key_1 naar database 8 te verplaatsen, voert u het volgende uit:

  1. move key_1 8

move geeft OK terug als het verplaatsen van de sleutel succesvol was.

Sleutels verwijderen

Om één of meer sleutels van elk gegevenstype te verwijderen, gebruikt u de del-opdracht gevolgd door één of meer sleutels die u wilt verwijderen:

  1. del key_1 key_2

Als deze opdracht de sleutel(s) succesvol verwijdert, geeft het (integer) 1 terug. Anders geeft het (integer) 0 terug.

De unlink-opdracht voert een vergelijkbare functie uit als del, met het verschil dat del de client blokkeert terwijl de server het geheugen terugwint dat door de sleutel wordt ingenomen. Als de te verwijderen sleutel is gekoppeld aan een klein object, is de tijd die del nodig heeft om het geheugen terug te vorderen zeer klein en de blokkeertijd is mogelijk niet eens merkbaar.

Echter kan het onhandig worden als bijvoorbeeld de sleutel die je wilt verwijderen is gekoppeld aan veel objecten, zoals een hash met duizenden of miljoenen velden. Het verwijderen van zo’n sleutel kan aanzienlijk lang duren en je wordt geblokkeerd van het uitvoeren van andere bewerkingen totdat het volledig uit het geheugen van de server is verwijderd. `

`unlink bepaalt echter eerst de kosten van het vrijmaken van het geheugen dat door de sleutel wordt ingenomen. Als dit klein is, werkt unlink op dezelfde manier als del door de sleutel onmiddellijk te verwijderen terwijl het ook de client blokkeert. Als er echter hoge kosten zijn verbonden aan het vrijmaken van geheugen voor een sleutel, zal unlink de sleutel `asynchroon` verwijderen door een andere thread te maken en geleidelijk geheugen vrij te maken op de achtergrond zonder de client te blokkeren: `

  1. unlink key_1

`Aangezien het op de achtergrond draait, wordt over het algemeen aanbevolen om unlink te gebruiken om sleutels van je server te verwijderen om fouten op je clients te verminderen, hoewel del ook in veel gevallen voldoende zal zijn. `

` `Waarschuwing:` De volgende twee commando’s worden als `gevaarlijk` beschouwd. De commando’s flushdb en flushall zullen respectievelijk alle sleutels in een enkele database en alle sleutels in elke database op de Redis-server onherroepelijk verwijderen. Het wordt aanbevolen om deze commando’s alleen uit te voeren als je er absoluut zeker van bent dat je alle sleutels in je database of server wilt verwijderen.

Het kan in jouw belang zijn om deze commando’s te hernoemen naar iets met een lagere kans om per ongeluk uitgevoerd te worden.

Om alle sleutels in de geselecteerde database te verwijderen, gebruik het flushdb-commando:

  1. flushdb

Om alle sleutels in elke database op een Redis-server te verwijderen (inclusief de momenteel geselecteerde database), voer flushall uit:

  1. flushall

Zowel flushdb als flushall accepteren de async-optie, waarmee je alle sleutels in een enkele database of elke database in de cluster asynchroon kunt verwijderen. Dit stelt ze in staat om op een vergelijkbare manier te functioneren als het unlink-commando, en ze zullen een nieuw draad maken om geheugen in de achtergrond geleidelijk vrij te maken.

Je Database Back-uppen

Om een back-up te maken van de momenteel geselecteerde database, kun je het save-commando gebruiken:

  1. save

Dit zal een momentopname van de huidige dataset exporteren als een .rdb-bestand, wat een database-dumpbestand is dat de gegevens vasthoudt in een interne, gecomprimeerde serialisatie-indeling.

save wordt synchroon uitgevoerd en blokkeert andere clients die verbonden zijn met de database. Daarom raadt de documentatie van het save commando aan dat dit commando bijna nooit moet worden uitgevoerd in een productieomgeving. In plaats daarvan wordt aanbevolen om het bgsave commando te gebruiken. Hiermee vertelt Redis om de database te forken: de ouder blijft clients bedienen terwijl het kindproces de database opslaat voordat het afsluit:

  1. bgsave

Merk op dat als clients gegevens toevoegen of wijzigen terwijl de bgsave operatie plaatsvindt, deze wijzigingen niet worden opgenomen in de snapshot.

U kunt ook het Redis configuratiebestand bewerken om Redis automatisch een snapshot te laten maken (bekend als snapshotting of RDB modus) na een bepaalde tijd als er een minimum aantal wijzigingen aan de database is aangebracht. Dit staat bekend als een save point. De volgende save point instellingen zijn standaard ingeschakeld in het redis.conf bestand:

/etc/redis/redis.conf
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .

Met deze instellingen exporteert Redis elke 900 seconden een snapshot van de database naar het bestand dat is gedefinieerd door de dbfilename parameter als er minstens één sleutel is gewijzigd, elke 300 seconden als er minstens 10 sleutels zijn gewijzigd, en elke 60 seconden als er minstens 10000 sleutels zijn gewijzigd.

U kunt het shutdown commando gebruiken om uw Redis-gegevens te back-uppen en vervolgens uw verbinding te verbreken. Dit commando zal elke client die verbonden is met de database blokkeren en vervolgens een save operatie uitvoeren als er minstens één save point is geconfigureerd, wat betekent dat het de database in zijn huidige staat exporteert naar een .rdb bestand terwijl het voorkomt dat clients wijzigingen aanbrengen.

Daarnaast zal het shutdown-commando wijzigingen naar het append-only bestand van Redis doorspoelen voordat het wordt afgesloten als de append-only modus is ingeschakeld. De append-only bestandsmodus (AOF) houdt in dat er een logboek wordt gemaakt van elke schrijfoperatie op de server in een bestand met de extensie .aof na elke momentopname. AOF- en RDB-modi kunnen worden ingeschakeld op dezelfde server, en het gebruik van beide persistentiemethoden is een effectieve manier om uw gegevens te back-uppen.

Kortom, het shutdown-commando is in wezen een blokkerend save-commando dat ook alle recente wijzigingen naar het append-only bestand doorspoelt en de verbinding met de Redis-instantie sluit:

Waarschuwing: Het shutdown-commando wordt als gevaarlijk beschouwd. Door de clients van uw Redis-server te blokkeren, kunt u uw gegevens onbeschikbaar maken voor gebruikers en applicaties die ervan afhankelijk zijn. Het wordt aanbevolen om dit commando alleen uit te voeren als u het gedrag van Redis wilt testen of als u er absoluut zeker van bent dat u alle clients van uw Redis-server wilt blokkeren.

In feite kan het in uw belang zijn om dit commando te hernoemen naar iets met een lagere kans om per ongeluk te worden uitgevoerd.

  1. shutdown

Als u geen save-punten hebt geconfigureerd maar toch wilt dat Redis een save-bewerking uitvoert, voeg dan de save-optie toe aan het shutdown-commando:

  1. shutdown save

Als je minstens één opslagpunt hebt geconfigureerd maar de Redis-server wilt afsluiten zonder een opslag uit te voeren, kun je het argument nosave toevoegen aan het commando:

  1. shutdown nosave

Merk op dat het append-only bestand na verloop van tijd erg lang kan worden, maar je kunt Redis configureren om het bestand opnieuw te schrijven op basis van bepaalde variabelen door het redis.conf-bestand te bewerken. Je kunt ook Redis opdracht geven om het append-only bestand opnieuw te schrijven door het bgrewriteaof-commando uit te voeren:

  1. bgrewriteaof

bgrewriteaof zal de kortste reeks commando’s maken die nodig zijn om de database terug te brengen naar zijn huidige toestand. Zoals de naam van dit commando al aangeeft, zal het op de achtergrond worden uitgevoerd. Als er echter al een ander persistentiecommando wordt uitgevoerd in een achtergrondproces, moet dat commando worden voltooid voordat Redis bgrewriteaof zal uitvoeren.

Conclusie

In deze handleiding worden verschillende commando’s beschreven die worden gebruikt om databases en sleutels te beheren. Als er andere gerelateerde commando’s, argumenten of procedures zijn die je in deze handleiding zou willen leren kennen, vraag dan gerust of doe suggesties in de opmerkingen.

Voor meer informatie over Redis-commando’s, bekijk onze tutorialserie over Hoe een Redis-database te beheren.

Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys