12 odabranih Redis intervju pitanjađ
Redis je na intervjuu prepreka koja se ne moĆŸe zaobiÄi â ako u biografiji napiĆĄete da ste koristili Redis, sigurno vas neÄe zaobiÄi. Danas Äemo simulirati kako intervjuer na temu Redis-a korak po korak produbljuje pitanja, sveobuhvatno proveravajuÄi koliko kandidat poznaje Redis.
Xiao Er: Zdravo, doĆĄao sam na intervju.
Intervjuer: Zdravo, Xiao Er. ProÄitao sam tvoju biografiju â dobro poznajeĆĄ Redis, pa Äu ti postaviti nekoliko pitanja vezanih za Redis. Prvo pitanje: da li je Redis jednoprocesni ili viĆĄeprocesni (single-threaded ili multi-threaded)?
Xiao Er:
RazliÄite verzije Redis-a koriste razliÄite modele niti. Pre verzije Redis 4.0 koristio se model jedne niti; posle verzije 4.0 dodata je podrĆĄka za viĆĄe niti.
Pre 4.0, iako kaĆŸemo da je Redis jednoprocesni, to se odnosi samo na to da mreĆŸna IO nit i Set i Get operacije obavlja jedna nit. Ali Redis-ova persistencija i sinhronizacija klastera i dalje se obavljaju u drugim nitima.
Posle 4.0 dodata je podrĆĄka za viĆĄe niti, koja se prvenstveno ogleda u asinhronom brisanju velikih podataka, na primer unlink key, flushdb async, flushall async itd.
Intervjuer: OdliÄan odgovor. ZaĆĄto je onda Redis pre 4.0 odabrao jednoprocesni model? A i pored toga bio je tako brz?
Xiao Er:
Mislim da je izbor jedne niti prvenstveno iz jednostavnosti koriĆĄÄenja â nema konkurencije za brave, sve operacije mogu se obaviti bez brava, bez mrtvih blokada i bez overhead-a zbog preklapanja niti. Istovremeno, jednoprocesni model ne moĆŸe u potpunosti da iskoristi performanse viĆĄjezgrenog CPU-a.
Ć to se tiÄe toga zaĆĄto je jednoprocesni model toliko brz, mislim da su glavni razlozi sledeÄi:
- VeÄina Redis operacija se obavlja u memoriji, gde je efikasnost izvrĆĄavanja sama po sebi veoma visoka, a koriste se i efikasne strukture podataka poput hash tabele i skip liste.
- KoriĆĄÄenje jedne niti izbegava konkurenciju izmeÄu niti, ĆĄtedi vreme i performanse na context switch-evima, i ne pojavljuju se mrtve blokade.
- Koristi I/O multiplexing mehanizam za obradu velikog broja klijentskih Socket zahteva; poĆĄto je to zasnovano na neblokirajuÄem I/O modelu, Redis moĆŸe efikasno da obavlja mreĆŸnu komunikaciju, a I/O read/write proces viĆĄe ne blokira.
Intervjuer: Dobro. Kako onda Redis obezbeÄuje da se podaci ne izgube?
Xiao Er:
Redis podaci se Äuvaju u memoriji. Da bi se osiguralo da se podaci ne izgube, potrebno je prebaciti ih iz memorije na disk, kako bi se nakon restarta servera podaci mogli oporaviti sa diska â to je Redis-ova persistencija podataka. Redis persistencija ima tri naÄina.
1) AOF log (Append Only File): beleĆŸi sve komande operacija i dodaje ih u fajl u tekstualnom obliku.
2) RDB snapshot (Redis DataBase): podatke iz memorije u odreÄenom trenutku upisuje na disk u binarnom obliku.
3) Hibridna persistencija: u Redis 4.0 dodata je hibridna persistencija koja objedinjuje prednosti RDB-a i AOF-a.
Intervjuer: Onda mi objasni princip implementacije AOF i RDB.
Xiao Er:
AOF koristi pristup write-after log-a â Redis prvo izvrĆĄi komandu i upiĆĄe podatke u memoriju, a zatim zapisuje log u fajl. AOF log beleĆŸi komande operacija, a ne stvarne podatke; ako se AOF koristi za oporavak nakon pada, potrebno je ponovo izvrĆĄiti sve komande iz loga.

RDB koristi pristup memorijskog snapshot-a â on beleĆŸi podatke u odreÄenom trenutku, a ne operacije; zato pri oporavku nakon pada dovoljno je samo proÄitati RDB fajl u memoriju, Äime se ostvaruje brz oporavak.
Intervjuer: Malopre si pomenuo da AOF koristi âwrite-after log" pristup, dok MySQL koji inaÄe koristimo primenjuje âwrite-ahead log". ZaĆĄto Redis prvo izvrĆĄava komandu, a zatim upisuje podatke u log?
Xiao Er: To je prvenstveno zato ĆĄto Redis pre upisivanja u log ne vrĆĄi proveru sintakse komande, pa beleĆŸi samo uspeĆĄno izvrĆĄene komande, izbegavajuÄi situaciju da se zapiĆĄe pogreĆĄna komanda; osim toga, upisivanje loga nakon izvrĆĄenja komande ne blokira tekuÄu write operaciju.
Intervjuer: A koje su rizici naknadnog upisivanja loga?
Xiao Er: Ja... ovo ne znam.
Intervjuer:
U redu, naknadno upisivanje loga nosi dva glavna rizika:
- Podaci mogu biti izgubljeni: ako Redis upravo izvrĆĄi komandu, a zatim doÄe do pada servera, ta komanda moĆŸe biti izgubljena.
- MoĆŸe blokirati druge operacije: AOF log se zapravo izvrĆĄava u glavnoj niti, tako da kada Redis upisuje log fajl na disk, i dalje blokira sledeÄe operacije.
Imam joĆĄ jedno pitanje: da li RDB snapshot blokira nit?
Xiao Er: Redis pruĆŸa dve komande za generisanje RDB snapshot fajla â save i bgsave. save komanda se izvrĆĄava u glavnoj niti i izaziva blokadu. bgsave komanda kreira child proces za upis RDB fajla, Äime se izbegava blokada glavne niti â to je i podrazumevana konfiguracija Redis RDB-a.
Intervjuer: Da li se podaci mogu menjati dok RDB radi snapshot?
Xiao Er: save je sinhron i blokira klijentske komande; tokom bgsave podaci se mogu menjati.
Intervjuer: Kako onda Redis reĆĄava da dozvoli izmenu podataka dok bgsave radi snapshot?
Xiao Er: Ovaj... to ne znam...

Intervjuer:
Ovde se prvenstveno koristi child proces bgsave-a. Konkretne operacije su sledeÄe:
- Ako glavna nit izvrĆĄava read operaciju, glavna nit i bgsave child proces se meÄusobno ne ometaju.
- Ako glavna nit izvrĆĄava write operaciju, izmenjeni podaci se kopiraju u jednu kopiju, a zatim bgsave child proces tu kopiju upisuje u RDB fajl. Tokom tog procesa glavna nit i dalje moĆŸe direktno menjati originalne podatke.

Treba napomenuti da je za Redis uÄestalost RDB izvrĆĄavanja veoma vaĆŸna, jer utiÄe na potpunost snapshot podataka i stabilnost Redis-a. Zato je u Redis 4.0 dodata hibridna persistencija koja kombinuje AOF i RDB: podaci se u RDB formatu upisuju u fajl, a zatim se naknadne komande operacija Äuvaju u AOF formatu u istom fajlu â Äime se obezbeÄuje brz restart Redis-a i smanjuje rizik od gubitka podataka.
Xiao Er: NauÄio sam, nauÄio sam.
Intervjuer: Onda mi reci kako Redis postiĆŸe visoku dostupnost?
Xiao Er: Redis postiĆŸe visoku dostupnost na tri glavna naÄina: master-slave replikacija, Sentinel (sentinel) mod i Redis klaster.
1) Master-slave replikacija
Sa jednog prethodnog Redis servera, podaci se sinhronizuju na viĆĄe Redis slave servera â model jedan master, viĆĄe slave, sliÄno principu MySQL master-slave replikacije.

2) Sentinel mod
KoriĆĄÄenje Redis master-slave servisa nosi jedan problem â kada Redis master-slave serveri padnu, potrebno je ruÄno izvrĆĄiti oporavak. Da bi se reĆĄio taj problem, Redis je uveo Sentinel mod (jer Sentinel mod moĆŸe da nadgleda master-slave servere i pruĆŸi funkciju automatskog oporavka od katastrofe).

3) Redis Cluster (klaster)
Redis Cluster je distribuirani, decentralizovani reĆŸim rada, uveden u verziji Redis 3.0 kao reĆĄenje za Redis klaster. On rasporeÄuje podatke na razliÄite servere, Äime se smanjuje zavisnost sistema od jednog master Ävora i poveÄavaju performanse Äitanja i pisanja Redis servisa.

Intervjuer: U Sentinel modu, podaci su zaĆĄtiÄeni replikama, a dostupnost se nadgleda pomoÄu Sentinela â kada master padne, bira se slave Ävor za novi master, ĆĄto veÄ zadovoljava naĆĄe potrebe u produkciji. ZaĆĄto onda joĆĄ uvek treba koristiti klaster mod?
Xiao Er: Sentinel mod je u suĆĄtini i dalje master-slave model. U master-slave modelu moĆŸemo poveÄanjem broja slave Ävorova proĆĄiriti sposobnost Äitanja, ali ne moĆŸemo proĆĄiriti sposobnost pisanja i skladiĆĄtenja â kapacitet skladiĆĄtenja je ograniÄen onim ĆĄto master Ävor moĆŸe da podnese. Zato, da bismo proĆĄirili sposobnost pisanja i skladiĆĄtenja, moramo uvesti klaster mod.
Intervjuer: U klasteru ima mnogo Master Ävorova â kako Redis Cluster pri Äuvanju podataka odreÄuje koji Ävor da izabere?
Xiao Er: Verovatno se koristi neki hash algoritam, ali ne znam taÄno...

Intervjuer: U redu, to je sve za danas, idi kuÄi i Äekaj naĆĄu vest o intervjuu.
Xiao Er: U redu, hvala. MoĆŸeĆĄ li mi reÄi kako Redis Cluster implementira izbor Ävora?
Intervjuer:
Redis Cluster koristi algoritam sliÄan consistent hashing-u za izbor Ävora â ĆĄta je consistent hashing algoritam, pogledaj sam kad doÄeĆĄ kuÄi.
Redis Cluster se deli na 16384 Slot-ova (slotova). Hash slot je sliÄan particiji podataka â svaki par kljuÄ-vrednost se na osnovu svog kljuÄa mapira u jedan hash slot. Konkretan proces izvrĆĄavanja se sastoji od dva glavna koraka.
Na osnovu kljuÄa para kljuÄ-vrednost, izraÄunava se vrednost od 16 bita prema CRC16 algoritmu.
Zatim se ta 16-bitna vrednost deli modulom sa 16384, Äime se dobija ostatak u opsegu 0~16383; svaki ostatak predstavlja jedan hash slot odgovarajuÄeg broja.
Svaki Redis Ävor je odgovoran za obradu dela slotova. Ako imate tri master Ävora A, B, C, Ävorovi su zaduĆŸeni za sledeÄe slotove:
| Ävor | Slotovi |
|---|---|
| A | 0-5000 |
| B | 5001 - 10000 |
| C | 10001 - 16383 |
Na taj naÄin se realizuje izbor Ävora u klasteru.
Älanak potiÄe iz JAVA Rizhilu, autor: Piaomiao Jam Link reprodukcije: https://mp.weixin.qq.com/s/GFUHslsSm96fJbhsCkFe_w
