LMOVE / BLMOVE în Redis & In-Memory Data Store

Comenzi pentru liste Redis 6.2.0

Mută atomic un element dintr-o listă în alta, alegând capătul din care scoate și capătul în care pune.

Sintaxă comandă
LMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT>
BLMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT> timeout

Ce face LMOVE / BLMOVE

LMOVE (din Redis 6.2.0) scoate un element din source și îl pune în destination, într-un singur pas atomic. Primul LEFT/RIGHT spune din ce capăt se scoate, al doilea în ce capăt se pune.

Este baza unei cozi sigure: workerul mută sarcina în lista „în lucru”, o procesează și apoi o șterge de acolo cu LREM. Dacă workerul cade, sarcina rămâne în „în lucru” și poate fi reluată. BLMOVE este varianta care așteaptă. Ele înlocuiesc comenzile RPOPLPUSH și BRPOPLPUSH, depreciate din 6.2.0.

Parametri

Parametru Descriere
source / destination Lista sursă și lista destinație (pot fi aceeași, pentru rotație).
LEFT | RIGHT (primul) Capătul din care se scoate elementul.
LEFT | RIGHT (al doilea) Capătul în care se pune elementul.
timeout Doar la BLMOVE: secunde de așteptare.

Ce returnează

Elementul mutat sau (nil) dacă sursa e goală (la BLMOVE: dacă a expirat timpul).

Exemple

Exemplul 1: Coadă sigură cu listă „în lucru”

Sarcina e mutată, procesată, apoi ștearsă din lista de lucru.

RPUSH sarcini:noi email:ana email:dan
LMOVE sarcini:noi sarcini:lucru LEFT RIGHT
LRANGE sarcini:lucru 0 -1
LREM sarcini:lucru 1 email:ana

Ieșire în redis-cli

127.0.0.1:6379> RPUSH sarcini:noi email:ana email:dan
(integer) 2
127.0.0.1:6379> LMOVE sarcini:noi sarcini:lucru LEFT RIGHT
"email:ana"
127.0.0.1:6379> LRANGE sarcini:lucru 0 -1
1) "email:ana"
127.0.0.1:6379> LREM sarcini:lucru 1 email:ana
(integer) 1

Exemplul 2: Rotația unei liste

Cu aceeași listă ca sursă și destinație, primul element trece la final (util pentru distribuire round-robin).

RPUSH servere s1 s2 s3
LMOVE servere servere LEFT RIGHT
LRANGE servere 0 -1

Ieșire în redis-cli

127.0.0.1:6379> RPUSH servere s1 s2 s3
(integer) 3
127.0.0.1:6379> LMOVE servere servere LEFT RIGHT
"s1"
127.0.0.1:6379> LRANGE servere 0 -1
1) "s2"
2) "s3"
3) "s1"

Greșeli frecvente

  • Ordinea direcțiilor contează: LEFT RIGHT scoate din stânga și pune în dreapta.
  • Fără un proces care verifică periodic lista „în lucru”, sarcinile workerilor căzuți rămân acolo pentru totdeauna.

Comenzi înrudite

  • LPOP / RPOP: Scoate și întoarce primul (LPOP) sau ultimul (RPOP) element dintr-o listă; cu count, mai multe deodată.
  • BLPOP / BRPOP: Scoate primul element dintr-o listă; dacă toate listele sunt goale, așteaptă (blochează) până apare un element sau expiră timpul.
  • LPUSH / RPUSH: Adaugă elemente la începutul (LPUSH) sau la sfârșitul (RPUSH) unei liste, creând lista dacă lipsește.
  • XREADGROUP: Citește mesaje dintr-un stream ca membru al unui grup de consumatori; fiecare mesaj ajunge la un singur consumator.