sql >> Database >  >> NoSQL >> Redis

Is de opdracht UNLINK altijd beter dan de opdracht DEL?

Laten we, voordat we bespreken welke beter is, eens kijken naar het verschil tussen deze commando's. Beide DEL en UNLINK bevrijd het belangrijkste onderdeel in de blokkeermodus. En het verschil is de manier waarop ze het waardegedeelte vrijmaken.

DEL maakt altijd het waardegedeelte vrij in de blokkeermodus. Als de waarde echter te groot is, b.v. te veel toewijzingen voor een grote LIST of HASH , het blokkeert Redis voor een lange tijd. Om het probleem op te lossen, implementeert Redis de UNLINK commando, d.w.z. een 'niet-blokkerende' verwijdering.

In feite, UNLINK is NIET altijd niet-blokkerend/async . Als de waarde klein is, b.v. de grootte van LIST of HASH is kleiner dan 64 , wordt de waarde onmiddellijk vrijgegeven. Op deze manier UNLINK is bijna hetzelfde als DEL , behalve dat het een paar functieaanroepen meer kost dan DEL . Als de waarde echter groot is, plaatst Redis de waarde in een lijst en wordt de waarde vrijgegeven door een andere thread, d.w.z. de niet-blokkerende gratis. Op deze manier moet de hoofdthread enige synchronisatie doen met de achtergrondthread, en dat is ook een kostenpost.

In een conclusie, als de waarde klein is, DEL is minstens zo goed als UNLINK . Als de waarde erg groot is, b.v. LIST met duizenden of miljoenen items, UNLINK is veel beter dan DEL . U kunt DEL altijd veilig vervangen met UNLINK . Als u echter merkt dat de threadsynchronisatie een probleem wordt (multi-threading is altijd lastig), kunt u teruggaan naar DEL .

UPDATE:

Sinds Redis 6.0 is er een nieuwe configuratie:lazyfree-lazy-user-del . U kunt dit instellen op ja , en Redis zal de DEL . uitvoeren commando alsof het uitvoeren van een UNLINK commando.



  1. Mongoose - veroorzaakt door ::11000 E11000 dubbele sleutelfoutindex?

  2. MongoDB en PostgreSQL-gedachten

  3. Wat is gedistribueerde atoomvergrendeling in cachestuurprogramma's?

  4. Databasereferenties correct verbergen