sql >> Database >  >> NoSQL >> Redis

StackExchange.Redis - LockTake / LockRelease-gebruik

Een slot bestaat uit 3 delen:

  • de sleutel (de unieke naam van het slot in de database)
  • de waarde (een door de beller gedefinieerd token dat zowel kan worden gebruikt om aan te geven wie de "eigenaar" is van het slot als om te controleren of het ontgrendelen en verlengen van het slot correct wordt gedaan)
  • de duur (een slot is opzettelijk een eindige duur)

Als er geen andere waarde in je opkomt, kan een gids een geschikte "waarde" maken. We hebben de neiging om de machinenaam te gebruiken (of een verminkte versie van de machinenaam als meerdere processen op dezelfde machine zouden kunnen concurreren).

Merk ook op dat het nemen van een slot speculatief is , niet blokkeren . Het is heel goed mogelijk dat je mislukt om het slot te verkrijgen, en daarom moet u dit mogelijk testen en misschien wat logica voor opnieuw proberen toevoegen.

Een typisch voorbeeld zou kunnen zijn:

RedisValue token = Environment.MachineName;
if(db.LockTake(key, token, duration)) {
    try {
        // you have the lock do work
    } finally {
        db.LockRelease(key, token);
    }
}

Merk op dat als het werk lang is (met name een lus), je misschien af ​​en toe wat LockExtend wilt toevoegen belt in het midden - opnieuw onthouden om te controleren op succes (voor het geval er een time-out optreedt).

Merk ook op dat alle individuele redis-commando's zijn atomair, dus u hoeft zich geen zorgen te maken over twee discrete bewerkingen die met elkaar concurreren. Voor meer complexe eenheden met meerdere operaties, transacties en scripting zijn opties.



  1. Hoe kan ik door live MongoDB-gegevens bladeren of deze opvragen?

  2. Django REST-framework reageert nog steeds met gegevens in de cache, zelfs na lege redis-sleutels

  3. Een subdocument bijwerken in mongodb

  4. MongoDB $binarySize