SET în Redis & In-Memory Data Store

Salvează o valoare text la o cheie, opțional cu expirare (EX/PX), doar dacă nu există (NX) sau doar dacă există (XX).

Sintaxă comandă
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]

Ce face SET

SET este comanda de bază din Redis: pune valoarea value la cheia key. Dacă cheia există deja, valoarea veche este înlocuită, indiferent de tipul ei, iar expirarea (TTL) veche se pierde.

Opțiunile transformă SET într-o comandă foarte utilă pentru cache și blocaje: EX setează expirarea în secunde, NX scrie doar dacă cheia nu există, iar GET întoarce valoarea veche. EX, PX, NX și XX există din Redis 2.6.12, KEEPTTL din 6.0, iar GET, EXAT și PXAT din 6.2.

Redis 8.4 a adăugat și condițiile IFEQ / IFNE (scrie doar dacă valoarea curentă este sau nu este egală cu una dată), utile pentru actualizări de tip compare-and-set.

Parametri

Parametru Descriere
key Numele cheii.
value Valoarea, salvată ca șir de octeți (text, număr sau date binare).
EX seconds / PX milliseconds Cheia expiră după numărul dat de secunde / milisecunde.
EXAT / PXAT Cheia expiră la un moment Unix exact (secunde / milisecunde).
NX Scrie doar dacă cheia NU există.
XX Scrie doar dacă cheia există deja.
KEEPTTL Păstrează expirarea pe care o avea cheia.
GET Returnează valoarea veche a cheii (sau nil) în loc de OK.

Ce returnează

OK dacă valoarea a fost scrisă, (nil) dacă NX/XX au împiedicat scrierea. Cu GET: valoarea veche sau (nil) dacă cheia nu exista.

Exemple

Exemplul 1: Cache cu expirare de 60 de secunde

Salvăm prețul unui produs pentru 60 de secunde, apoi verificăm cât mai are de trăit cheia.

SET pret:laptop "3499" EX 60
GET pret:laptop
TTL pret:laptop

Ieșire în redis-cli

127.0.0.1:6379> SET pret:laptop "3499" EX 60
OK
127.0.0.1:6379> GET pret:laptop
"3499"
127.0.0.1:6379> TTL pret:laptop
(integer) 60

Exemplul 2: NX: scrie doar prima dată

Al doilea SET ... NX nu suprascrie valoarea, pentru că cheia există deja. Așa se face un blocaj simplu.

SET blocaj:raport ana NX EX 30
SET blocaj:raport dan NX EX 30
GET blocaj:raport

Ieșire în redis-cli

127.0.0.1:6379> SET blocaj:raport ana NX EX 30
OK
127.0.0.1:6379> SET blocaj:raport dan NX EX 30
(nil)
127.0.0.1:6379> GET blocaj:raport
"ana"

Exemplul 3: GET: înlocuiește și află valoarea veche

Cu opțiunea GET, comanda întoarce valoarea de dinainte, într-un singur pas atomic.

SET stare:comanda:1042 noua
SET stare:comanda:1042 expediata GET
GET stare:comanda:1042

Ieșire în redis-cli

127.0.0.1:6379> SET stare:comanda:1042 noua
OK
127.0.0.1:6379> SET stare:comanda:1042 expediata GET
"noua"
127.0.0.1:6379> GET stare:comanda:1042
"expediata"

Greșeli frecvente

  • Un SET simplu pe o cheie cu expirare șterge expirarea: cheia devine permanentă. Folosește KEEPTTL dacă vrei să păstrezi TTL-ul.
  • EX primește secunde, iar PX milisecunde: PX 60 înseamnă 0,06 secunde, nu un minut.
  • SET suprascrie și chei de alt tip (hash, listă): datele vechi se pierd fără avertisment.

Comenzi înrudite

  • GET: Citește valoarea text salvată la o cheie; întoarce nil dacă cheia nu există.
  • MSET / MGET: Scrie (MSET) sau citește (MGET) mai multe chei string într-o singură comandă atomică.
  • EXPIRE / PEXPIRE: Setează după câte secunde (EXPIRE) sau milisecunde (PEXPIRE) se șterge automat o cheie.
  • TTL / PTTL: Arată cât timp mai are o cheie până expiră: în secunde (TTL) sau milisecunde (PTTL); -1 fără expirare, -2 dacă nu există.
  • GETDEL / GETEX: GETDEL citește și șterge o cheie într-un singur pas; GETEX citește și schimbă expirarea cheii.