sql >> Databáze >  >> NoSQL >> Redis

StackExchange.Redis - Použití LockTake / LockRelease

Zámek má 3 části:

  • klíč (jedinečný název zámku v databázi)
  • hodnota (token definovaný volajícím, který lze použít k označení, kdo „vlastní“ zámek, a ke kontrole, zda uvolnění a vysunutí zámku probíhá správně)
  • doba trvání (zámek je záměrně omezená doba trvání)

Pokud vás žádná jiná hodnota nenapadne, může vhodnou „hodnotu“ vytvořit průvodce. Máme tendenci používat název počítače (nebo zkrácenou verzi názvu počítače, pokud by na stejném počítači mohlo soutěžit více procesů).

Vezměte také na vědomí, že uzamčení je spekulativní , nikoli blokování . Je zcela možné, že neuspějete k získání zámku, a proto možná budete muset toto otestovat a možná přidat nějakou logiku opakování.

Typickým příkladem může být:

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

Pamatujte, že pokud je práce zdlouhavá (zejména smyčka), možná budete chtít přidat nějaké příležitostné LockExtend volání uprostřed – opět nezapomeňte zkontrolovat úspěšnost (v případě, že vypršel časový limit).

Všimněte si také, že vše jednotlivé příkazy redis jsou atomické, takže se nemusíte bát, že by dvě diskrétní operace soupeřily. Pro složitější multioperační jednotky, transakce a skriptování jsou možnosti.



  1. Hromadné vkládání Redis

  2. MongoNetworkError:Nepodařilo se připojit k serveru [localhost:27017] při prvním připojení [MongoNetworkError:připojit ECONNREFUSED 127.0.0.1:27017]

  3. Agregace MongoDB na Loopback

  4. Správný způsob použití Redis Connection Pool v Pythonu