Redis este o rețea populară în memorie utilizată pentru comunicarea între proces și stocarea datelor. Este posibil să fi auzit că vă permite să rulați scripturi Lua, dar încă nu sunteți sigur de ce. Dacă sună ca tine, citește mai departe.

Un ghid rapid pentru scripturile Redis Lua

Condiții prealabile

Tu trebuie sa ai Redis instalat pe sistemul dvs. pentru a urma acest ghid. Ar putea fi util să verificați Referința comenzilor Redis în timp ce citești.

De ce am nevoie de scripturi Lua?

Pe scurt: câștig de performanță. Majoritatea sarcinilor pe care le faceți în Redis implică mulți pași. În loc să faceți acești pași în limba aplicației dvs., o puteți face în Redis cu Lua.

  • Acest lucru poate duce la performanțe mai bune.
  • De asemenea, toți pașii dintr-un script sunt executați într-un mod atomic. Nicio altă comandă Redis nu poate rula în timp ce se execută un script.

De exemplu, folosesc scripturi Lua pentru a schimba șirurile JSON stocate în Redis. Descriu acest lucru în detaliu mai aproape de sfârșitul acestui articol.

Dar nu cunosc niciun Lua

Un ghid rapid pentru scripturile Redis Lua
O persoană care nu cunoaște niciun lua

Nu vă faceți griji, Lua nu este foarte greu de înțeles. Daca stii orice limbă din familia C., ar trebui să fii în regulă cu Lua. De asemenea, ofer exemplele de lucru în acest articol.

Arată-mi un exemplu

Să începem prin rularea scripturilor prin redis-cli. Începeți cu:

redis-cli

Acum executați următoarea comandă:

eval “redis.call(‘set’, KEYS[1], ARGV[1])” 1 key:name value

EVAL comanda este cea care îi spune lui Redis să ruleze scriptul care urmează. ”redis.call(‘set’, KEYS[1], ARGV[1])”șirul este scriptul nostru care este identic funcțional cu cel al lui Redis set comanda. Trei parametri urmează textul scriptului:

  1. Numărul de taste furnizate
  2. Nume cheie
  3. Primul argument

Argumentele scriptului se împart în două grupuri: CHEIE și ARGV.

Specificăm câte taste necesită scriptul cu numărul imediat următor. În exemplul nostru, este 1. Imediat după acest număr, trebuie să furnizăm aceste chei, una după alta. Sunt accesibile ca CHEIE tabel în cadrul scriptului. În cazul nostru, conține o singură valoare key:name la index 1.

Rețineți că tabelele indexate Lua încep cu index 1, nu 0.

Putem furniza orice număr de argumente după chei, care vor fi disponibile în Lua ca ARGV masa. În acest exemplu, oferim un singur ARGV-argument: șir value. După cum ați ghicit deja, comanda de mai sus setează cheia key:name a valorifica value.

Este considerată o bună practică să furnizați chei pe care scriptul le folosește CHEIE, și toate celelalte argumente ca ARGV. Deci nu ar trebui să specificați CHEIE ca 0 și apoi furnizați toate cheile din ARGV masa.

Să verificăm acum dacă scriptul s-a finalizat cu succes. Vom face acest lucru rulând un alt script care obține cheia de la Redis:

eval „return redis.call (‘get’, KEYS[1]) ”1 cheie: nume

Rezultatul ar trebui să fie ”value”, ceea ce înseamnă că scriptul anterior a setat cu succes cheia “key:name”.

Puteți explica scenariul?

Un ghid rapid pentru scripturile Redis Lua
Doge după ce a văzut scenariul de mai sus

Primul nostru script constă dintr-o singură afirmație: redis.call funcţie:

redis.call(‘set’, KEYS[1], ARGV[1])

Curedis.call puteți executa orice comandă Redis. Primul argument este numele acestei comenzi urmat de parametrii săi. În cazul set comanda, aceste argumente sunt cheie și valoare. Sunt acceptate toate comenzile Redis. Conform documentației:

Redis folosește același interpret Lua pentru a rula toate comenzile

Cel de-al doilea script face puțin mai mult decât rularea unei singure comenzi – de asemenea, returnează o valoare:

eval “return redis.call(‘get’, KEYS[1])” 1 key:name

Totul returnat de script este trimis procesului de apelare. În cazul nostru, acest proces este redis-cli și veți vedea rezultatul în fereastra terminalului.

Ceva mai complex?

1611940446 127 Un ghid rapid pentru scripturile Redis Lua
O persoană care intenționează să construiască un scenariu Redis complex

Am folosit odată scripturile Lua pentru a returna elemente dintr-o hartă hash într-o anumită ordine. Comanda în sine a fost specificată prin chei hash stocate într-un set sortat.

Mai întâi să configurăm datele noastre executând aceste comenzi în redis-cli:

hmset hkeys key:1 value:1 key:2 value:2 key:3 value:3 key:4 value:4 key:5 value:5 key:6 value:6
zadd order 1 key:3 2 key:1 3 key:2

Aceste comenzi creează o hartă hash la cheie hkeys și un set sortat la cheie order care conține tastele selectate din hkeys într-o ordine specifică.

S-ar putea să doriți să verificați hmset și zadd comandă referință pentru detalii.

Să rulăm următorul script:

eval “local order = redis.call(‘zrange’, KEYS[1], 0, -1); return redis.call(‘hmget’,KEYS[2],unpack(order));” 2 order hkeys

Ar trebui să vedeți următoarea ieșire:

“value:3”
“value:1”
“value:2”

Ceea ce înseamnă că am obținut valori ale cheilor dorite și în ordinea corectă.

Trebuie să specific textul complet al scriptului pentru al rula?

Nu! Redis vă permite să preîncărcați un script în memorie cu ÎNCĂRCARE SCRIPT comanda:

script load “return redis.call(‘get’, KEYS[1])”

Ar trebui să vedeți o ieșire ca aceasta:

“4e6d8fc8bb01276962cce5371fa795a7763657ae”

Acesta este hashul unic al scriptului pe care trebuie să îl furnizați EVALSHA comanda pentru a rula scriptul:

evalsha 4e6d8fc8bb01276962cce5371fa795a7763657ae 1 key:name

Notă: ar trebui să utilizați actual SHA1 hash returnat de ÎNCĂRCARE SCRIPT comanda, hashul de mai sus este doar un exemplu.

Ce ai menționat despre schimbarea JSON?

Uneori oamenii stochează obiecte JSON în Redis. Indiferent dacă este o idee bună sau nu, este o altă poveste, dar în practică, acest lucru se întâmplă foarte mult.

Dacă trebuie să schimbați o cheie în acest obiect JSON, trebuie să o obțineți de la Redis, să o analizați, să schimbați cheia, apoi să o serializați și să o setați din nou la Redis. Există câteva probleme cu această abordare:

  1. Concurență. Un alt proces poate schimba acest JSON între operațiile noastre get și set. În acest caz, schimbarea se va pierde.
  2. Performanţă. Dacă faceți aceste modificări suficient de des și dacă obiectul este destul de mare, acesta ar putea deveni blocajul aplicației dvs. Puteți câștiga unele performanțe implementând această logică în Lua.

Să adăugăm un șir de test JSON la Redis sub cheie obj:

set obj ‘{“a”:”foo”,”b”:”bar”}’

Acum, să rulăm scriptul nostru:

EVAL ‘local obj = redis.call(“get”,KEYS[1]); local obj2 = string.gsub(obj,”(“ .. ARGV[1] .. “”:)([^,}]+)”, “%1” .. ARGV[2]); return redis.call(“set”,KEYS[1],obj2);’ 1 obj b bar2

Acum vom avea următorul obiect sub cheie obj:

{“a”:”foo”,”b”:”bar2"}

În schimb, puteți încărca acest script cu SCRIPT LOAD comanda:

SCRIPT LOAD ‘local obj = redis.call(“get”,KEYS[1]); local obj2 = string.gsub(obj,”(“ .. ARGV[1] .. “”:)([^,}]+)”, “%1” .. ARGV[2]); return redis.call(“set”,KEYS[1],obj2);’

și apoi rulați-l așa:

EVALSHA <your_script_sha> 1 obj b bar2

Câteva note:

  • .. este operatorul de concatenare șir din Lua.
  • Folosim un model RegEx pentru a potrivi cheia și a înlocui valoarea acesteia. Dacă nu înțelegeți această expresie regulată, puteți verifica ghidul meu recent.
  • O diferență a aromei Lua RegEx față de majoritatea celorlalte arome este că folosim % ca semn de referință inversă și caracter de evadare pentru simbolurile speciale RegEx.
  • Încă scăpăm cu si nu % pentru că scăpăm de delimitatorul șirului Lua, nu de simbolul special RegEx.

Ar trebui să folosesc întotdeauna scripturi Lua?

Nu. Vă recomand să le utilizați numai atunci când puteți dovedi că rezultă o performanță mai bună. Rulați întotdeauna mai întâi etaloane.

Dacă tot ce vrei este atomicitate, atunci ar trebui să verificați în schimb tranzacțiile Redis.

De asemenea, scriptul dvs. nu ar trebui să fie prea lung. Amintiți-vă că, în timp ce rulează un script, orice altceva așteaptă să se termine. Dacă scriptul dvs. durează destul de mult timp, poate provoca blocaje în loc să îmbunătățească performanța. Scriptul se oprește după ce a atins un timeout (5 secunde în mod implicit).

1611940446 745 Un ghid rapid pentru scripturile Redis Lua
Scripturile Redis nu ar trebui să dureze prea mult timp

Ultimul cuvant

Pentru mai multe informații despre verificarea Lua lua.org.

Puteți verifica biblioteca mea node.js de pe GitHub pentru câteva exemple de scripturi Lua (vezi src/lua pliant). De asemenea, puteți utiliza această bibliotecă în node.js pentru a schimba obiecte JSON fără a scrie singur scripturi Lua.

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

Vă mulțumim că ați citit acest articol. Întrebările și comentariile sunt foarte apreciate. De asemenea, sunteți binevenit să mă urmați pe Twitter.