Bloqueo de lectura y escritura de Redisson

¿Qué problemas surgirán si solo se usa un mutex en un escenario de alta concurrencia?
  • Solo se puede ocupar una solicitud a la vez. Si surge una gran cantidad de solicitudes simultáneas, el rendimiento disminuirá drásticamente. Todas las solicitudes deben bloquearse. Por ejemplo, si los datos no se han modificado de ninguna manera, no es necesario para bloquearlo.
  • Si la solicitud para leer los datos no se ha leído, en este momento llega una solicitud de escritura y los datos no se pueden escribir en este momento; de lo contrario, los datos serán incorrectos. La solicitud de escritura solo se puede ejecutar después de todos los bloqueos de lectura anteriores. se liberan, por lo que necesita agregar un indicador (bloqueo de lectura) a esta solicitud de lectura para que la solicitud de escritura sepa que los datos no se pueden modificar en este momento, de lo contrario, los datos serán inconsistentes.
  • Si alguien ya está escribiendo datos, no se permite otra solicitud para escribir datos, lo que también generará inconsistencias en los datos, por lo que todas las solicitudes de escritura deben agregar un bloqueo de escritura para evitar escribir en datos compartidos al mismo tiempo.
Redisson nos proporciona un mecanismo de bloqueo de lectura y escritura. Podemos usar bloqueos de lectura y escritura para garantizar la concurrencia y la seguridad de los datos mientras optimizamos la eficiencia de lectura y escritura de nuestras claves de punto de acceso.
/**
 * 保证一定能读到最新数据,修改期间,写锁是一个排他锁(互斥锁)。读锁是一个共享锁
 * 写锁没释放,读就必须等待
 */
@GetMapping("/readHotKeyValue")
@ResponseBody
public String readHotKeyValue() {
    
    

    RReadWriteLock readWriteLock = redisson.getReadWriteLock("rw-lock");
    String s = "";
    RLock rLock = readWriteLock.readLock();
    try {
    
    
        rLock.lock();
        s = stringRedisTemplate.opsForValue().get("myhotkey");
    } catch (Exception e) {
    
    
        e.printStackTrace();
    } finally {
    
    
        rLock.unlock();
    }
    return s;
}


@PostMapping("/writeHotKeyValue")
@ResponseBody
public boolean writeHotKeyValue() {
    
    

    RReadWriteLock readWriteLock = redisson.getReadWriteLock("rw-lock");
    boolean result = true;
    String s = "";
    RLock wLock = readWriteLock.writeLock();
    try {
    
    
        // 1、改数据加写锁,读数据加读锁
        wLock.lock();
        // 具体业务处理逻辑...
        s = UUID.randomUUID().toString();
        stringRedisTemplate.opsForValue().set("myHotKey", s);
    } catch (InterruptedException e) {
    
    
    	result = false;
        e.printStackTrace();
    } finally {
    
    
        wLock.unlock();
    }
    return result;
}

  • Lectura + lectura: equivalente a lectura simultánea sin bloqueo, solo se registrará en redis, y todos los bloqueos de lectura actuales se bloquearán con éxito al mismo tiempo
  • Escribir + Leer: Esperando a que se libere el bloqueo de escritura
  • Escribir + escribir: modo de bloqueo
  • Leer + escribir: hay un bloqueo de lectura y la escritura también debe esperar
En resumen: mientras haya escritura, debe esperar

Supongo que te gusta

Origin blog.csdn.net/qq_40436854/article/details/120652164
Recomendado
Clasificación