Hajautetut lukitukset Redisillä
Toteuttakaa luotettavat hajautetut lukitusmekanismit Redisillä samanaikaisten järjestelmien käyttöoikeuksien koordinointiin.
Hajautetut lukitukset Redisillä on ilmainen Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-kurssilla on yhteensä 4 oppituntia.
Hajautettujen lukkojen tarve
Kuvitelkaa, että useat sovellukset tai palvelut yrittävät päivittää samaa tietoa, kuten käyttäjän saldoa tai yksilöllistä tilaustunnusta. Ilman koordinointia ne voivat korvata toistensa muutokset, mikä johtaa tietojen vioittumiseen tai virheellisiin tiloihin.
- Kilpailutilanteet: Tilanteet, joissa toiminnot riippuvat tietystä ajoituksesta ja tulokset ovat ennakoimattomia.
- Tietojen eheys: Jaettujen resurssien yhdenmukaisuuden varmistaminen.
- Samanaikaisuuden hallinta: Käytön hallinta, kun useat prosessit suoritetaan samanaikaisesti.
Hajautetut lukot ovat kuin yksi avain yhteiseen huoneeseen. Vain yksi prosessi voi pitää avainta eli lukkoa kerrallaan, mikä varmistaa yksinomaisen käyttöoikeuden.
Miksi Redis hajautettuihin lukkoihin?
Redis sopii erinomaisesti hajautettujen lukkojen toteuttamiseen nopeutensa, atomisten toimintojensa ja yksisäikeisyytensä ansiosta.
- Atomisuus: Redis-komennot suoritetaan atomisesti: ne suoritetaan kokonaan tai ei lainkaan, mikä estää osittaiset päivitykset.
- Suorituskyky: Muistissa suoritettavat toiminnot takaavat erittäin pienen viiveen lukon hankinnassa ja vapautuksessa.
- Yksinkertaisuus: Merkkijonojen peruskomentoja voidaan hyödyntää tehokkaasti lukitsemiseen.
Näiden ominaisuuksien ansiosta Redis pystyy hallitsemaan lukkojen tiloja luotettavasti ja tehokkaasti useiden eri sovellusinstanssien välillä.
Lukon hankinnan perusteet (SET NX EX)
Redis-pohjaisen lukon ydin on SET-komento erityisine valitsimineen:
NX(Not eXists): Varmistaa, että avain asetetaan vain, jos sitä ei ole jo olemassa. Näin lukko hankitaan yksinomaisesti.EX(EXpire): Asettaa avaimelle vanhentumisajan sekunteina. Tämä on olennaista lukkiutumisen estämiseksi, jos asiakas kaatuu ennen lukon vapauttamista.value: Lukon haltijan yksilöllinen tunniste (esimerkiksi UUID). Näin vain alkuperäinen lukon haltija voi vapauttaa sen.
Komento näyttää tältä: SET mylock:resource <unique_id> NX EX 30
Lukon hankinta: koodiesimerkki
Tässä on yksinkertaistettu esimerkki siitä, miten asiakas voi yrittää hankkia lukon Pythonilla. SET-komento palauttaa arvon True (tai 'OK'), jos lukko hankittiin, ja muussa tapauksessa arvon False (tai None).
import redis
import uuid
# Connect to Redis
r = redis.Redis(decode_responses=True)
lock_key = "resource:123:lock"
client_id = str(uuid.uuid4())
lock_timeout_seconds = 10
print(f"Client {client_id} attempting to acquire lock...")
# Attempt to acquire the lock
# set(name, value, nx=True, ex=timeout) maps to SET key value NX EX timeout
lock_acquired = r.set(lock_key, client_id, nx=True, ex=lock_timeout_seconds)
if lock_acquired:
print(f"Client {client_id} acquired the lock!")
# Simulate work
# time.sleep(5)
# ... do critical section work ...
# r.delete(lock_key) # DON'T do this directly!
else:
print(f"Client {client_id} failed to acquire the lock. It's held by someone else.")
# In a real app, you'd release the lock safely later.Lukon turvallisen vapauttamisen haaste
Pelkkä lukon avaimen poistaminen (esimerkiksi DEL mylock:resource) EI ole turvallista. Tarkastellaan seuraavaa tilannetta:
- Asiakas A hankkii lukon, jonka vanhentumisaika on 10 sekuntia.
- Asiakkaan A toiminto kestää yli 10 sekuntia, joten lukko vanhenee automaattisesti.
- Asiakas B hankkii saman resurssin lukon.
- Asiakkaan A toiminto valmistuu viimein ja yrittää poistaa lukon. Se poistaa tietämättään asiakkaan B lukon!
Tällöin kaksi asiakasta luulee hallitsevansa lukkoa samanaikaisesti, mikä kumoaa sen tarkoituksen. Tarvitsemme atomisen tavan tarkistaa omistajuus JA poistaa lukko.
Atominen vapautus Lua-komentosarjoilla
Redis sallii Lua-komentosarjojen atomisen suorittamisen. Tämä tarkoittaa, että koko komentosarja suoritetaan Redis-palvelimella yhtenä keskeytymättömänä toimintona, mikä ratkaisee lukon vapauttamiseen liittyvän ongelman.
Lukon vapauttamiseen tarkoitettu Lua-komentosarja tekee yleensä kaksi asiaa:
- Se tarkistaa, vastaako lukon nykyinen arvo lukon vapauttamista yrittävän asiakkaan antamaa yksilöllistä tunnistetta.
- Jos ne vastaavat toisiaan, se poistaa lukon avaimen.
Näin varmistetaan, että vain lukon alun perin hankkinut asiakas, jonka yksilöllinen tunniste on edelleen tallennettuna, voi vapauttaa lukon, vaikka lukko olisi vanhentunut ja toinen asiakas olisi hankkinut sen uudelleen.
Lukon vapautus: koodiesimerkki
Näin suoritatte Lua-komentosarjan lukon turvallista vapauttamista varten. Komentosarja varmistaa, että poistatte lukon vain, jos olette sen oikea omistaja.
import redis
import uuid
r = redis.Redis(decode_responses=True)
lock_key = "resource:123:lock"
client_id = str(uuid.uuid4())
lock_timeout_seconds = 10
# Assume client_id has previously acquired the lock
# For demonstration, let's manually set it:
r.set(lock_key, client_id, nx=True, ex=lock_timeout_seconds)
print(f"Client {client_id} acquired the lock for demo.")
lua_script = """
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
else
return 0
end
"""
# Execute the Lua script
# KEYS[1] is lock_key, ARGV[1] is client_id
released = r.eval(lua_script, 1, lock_key, client_id)
if released:
print(f"Client {client_id} successfully released the lock.")
else:
print(f"Client {client_id} failed to release the lock (not owner or already expired).")
# Check if the key still exists
if r.exists(lock_key):
print(f"Lock key '{lock_key}' still exists.")
else:
print(f"Lock key '{lock_key}' does not exist.")Lukon vanhentuminen ja uusiminen
EX-asetus (vanhentuminen) on elintärkeä. Se toimii turvaverkkona ja varmistaa, että lukot vapautetaan lopulta, vaikka asiakas kaatuisi tai ei pystyisi vapauttamaan lukkoa. Ilman vanhentumista kaatunut asiakas voisi pitää lukkoa hallussaan rajattomasti, mikä aiheuttaisi pysyvän lukkiutumisen.
- Liian lyhyt: Jos vanhentumisaika on liian lyhyt, pitkään kestävät tehtävät voivat menettää lukon ennenaikaisesti.
- Liian pitkä: Jos se on liian pitkä, lukkiutumiset voivat jatkua liian kauan.
Tehtäviä varten, jotka voivat ylittää alkuperäisen vanhentumisajan, asiakkaat voivat toteuttaa lukon uusimismekanismin. Siinä tarkistetaan säännöllisesti, onko lukko edelleen hallussa, ja jos on, sen vanhentumisaikaa pidennetään komennoilla EXPIRE tai PEXPIRE.
Redlock: paremmat takeet
Vaikka yksi Redis-instanssi yhdessä komennon SET NX EX kanssa toimii monissa tapauksissa, se muodostaa yhden vikaantumispisteen. Jos Redis-instanssi lakkaa toimimasta, kaikki lukot menetetään tai ne eivät ole käytettävissä.
Redlock-algoritmi ratkaisee tämän edellyttämällä, että asiakkaat hankkivat lukot itsenäisten Redis-pääinstanssien enemmistöltä (esimerkiksi 3 instanssilta 5:stä). Tämä tarjoaa paremmat takeet:
- Vikasietoisuus: Jos yksi Redis-instanssi vikaantuu, järjestelmä voi edelleen toimia.
- Vahvempi turvallisuus: Pienentää todennäköisyyttä, että useat asiakkaat hankkivat saman lukon.
Redlock on monimutkaisempi toteuttaa, mutta tarjoaa vankan ratkaisun kriittisiin hajautettuihin järjestelmiin.
Pikatarkistus: lukon ominaisuudet
Mitkä seuraavista ovat luotettavan, Redisia käyttävän hajautetun lukon olennaisia ominaisuuksia, kun oletetaan yksi Redis-instanssi?
Kertaus: hajautetut lukot Redisillä
Tässä oppitunnissa tarkastelimme, miten Redisillä toteutetaan luotettavia hajautettuja lukkoja.
- Opimme, että
SET key value NX EX secondsmuodostaa perustan lukon atomiselle hankkimiselle. - Yksilöllinen arvo tunnistaa lukon haltijan ja estää muita vapauttamasta lukkoa.
- Vanheneminen (
EX) on tärkeää, jotta asiakkaan kaatuminen ei aiheuta pysyvää lukkiutumista. - Lukon turvallinen vapauttaminen edellyttää atomista tarkistus- ja poistotoimintoa, joka toteutetaan yleensä Lua-komentosarjalla.
- Redlock-algoritmia voidaan käyttää paremman luotettavuuden ja vikasietoisuuden saavuttamiseksi usean instanssin kokoonpanoissa.
Näiden periaatteiden ymmärtäminen on olennaista vankkojen ja samanaikaisten hajautettujen sovellusten rakentamisessa.
Opi Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams) tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Hajautetut lukitukset Redisillä” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppimispolun 3 oppituntia, myös oppitunnin “Hajautetut lukitukset Redisillä”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Hajautetut lukitukset Redisillä”?
Toteuttakaa luotettavat hajautetut lukitusmekanismit Redisillä samanaikaisten järjestelmien käyttöoikeuksien koordinointiin. Harjoittelet Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Hajautetut lukitukset Redisillä”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppitunnilla?
Kyllä. Jokainen Redis-välimuisti ja viestinvälitys (Pub/Sub, Streams)-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Hajautetut lukitukset Redisillä
- Johtajan valinnan mallit
- Redis koordinointipalveluna
- Hajautettu nopeudenrajoitus