sql >> Base de Datos >  >> NoSQL >> Redis

StackExchange.Redis - Uso de LockTake/LockRelease

Hay 3 partes en una cerradura:

  • la clave (el nombre único de la cerradura en la base de datos)
  • el valor (un token definido por la persona que llama que se puede usar tanto para indicar quién es el "propietario" del bloqueo como para comprobar que la liberación y la extensión del bloqueo se realizan correctamente)
  • la duración (un bloqueo intencionalmente es algo de duración finita)

Si no se le ocurre ningún otro valor, un guid podría ser un "valor" adecuado. Tendemos a usar el nombre de la máquina (o una versión modificada del nombre de la máquina si varios procesos pueden estar compitiendo en la misma máquina).

Además, tenga en cuenta que tomar un candado es especulativo , no bloquear . Es muy posible que falles para obtener el bloqueo y, por lo tanto, es posible que deba probarlo y tal vez agregar alguna lógica de reintento.

Un ejemplo típico podría ser:

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

Tenga en cuenta que si el trabajo es largo (un bucle, en particular), es posible que desee agregar algunos LockExtend ocasionales llamadas en el medio, nuevamente recordando verificar el éxito (en caso de que se agote el tiempo).

Tenga en cuenta también que todos los comandos redis individuales son atómicos, por lo que no necesita preocuparse por la competencia de dos operaciones discretas. Para unidades de operaciones múltiples más complejas, transacciones y secuencias de comandos son opciones.