Expansión relacionada de Redis (transacción, monitoreo, Jedis)

1. Asuntos

1. Introducción

Esencia de la transacción de Redis: un conjunto de comandos, todos los comandos de una transacción se serializarán y se ejecutarán en orden durante la ejecución de la transacción. Ejecución única, secuencial y exclusiva de una serie de comandos.
Las transacciones de Redis no tienen el concepto de nivel de aislamiento
. Todos los comandos no se ejecutan directamente en la transacción. Solo se ejecutarán cuando se inicie el comando de ejecución.
Redis single El comando guarda la atomicidad, pero las transacciones no garantizan la atomicidad.

2. Proceso

Abrir cola de comandos de transacción (multi)
(...)
ejecutar transacción (exec)

3. comando de shell

3.1 Iniciar una transacción

# 开启事务
127.0.0.1:6379> multi
OK
# 命令入队
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
# 执行事务
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "v2"
4) OK

3.2 Abandonar una transacción

Ninguno de los comandos en la cola de transacciones se ejecutará

# 开启事务
127.0.0.1:6379> multi
OK
# 命令入队
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
# 放弃事务
127.0.0.1:6379(TX)> discard
ok

3.3 Excepciones de compilación (código incorrecto, comando incorrecto)

No se ejecutarán todos los comandos de la transacción.

3.4 Excepciones de tiempo de ejecución

Si hay un error gramatical en la cola de transacciones, cuando se ejecuta el comando, se pueden ejecutar otros comandos normalmente y el comando incorrecto genera una excepción.

Dos, monitoreo (ver)

1. bloquear

1.1 Bloqueo pesimista

Muy pesimista, pensando que habrá problemas en cualquier momento y todo quedará bloqueado.

1.2 Bloqueo optimista

Muy optimista, pensando que no habrá problemas en ningún momento, por lo que no se bloqueará, al actualizar los datos juzgue si alguien ha modificado los datos durante este período.
Comparar la versión al obtener
la actualización de la versión

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
# 监视money对象(加乐观锁)
127.0.0.1:6379> watch money
OK
# 事务正常结束,数据期间没有发生变动,这个时候就正常执行成功
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 20
QUEUED
127.0.0.1:6379(TX)> incrby out 20
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 80
2) (integer) 20

2. Presta atención

2.1 Principio

Cuando se utilizan subprocesos múltiples para modificar el valor, el uso de watch se puede utilizar como una operación de bloqueo optimista de redis,
es decir, antes de ejecutar este subproceso (A), otro subproceso (B) modifica el valor del objeto monitoreado (C). En este momento, si este Subproceso (A) continúa realizando algunas operaciones, la transacción fallará. A menos que el hilo (A) primero deje de monitorear el objeto (C) y luego vuelva a monitorear el objeto (C), después de realizar algunas operaciones, la transacción se puede ejecutar con éxito.

2.2 Proceso

(1) Si se descubre que la ejecución de la transacción falla, se desbloqueará primero

unwatch

(2) Luego obtenga el nuevo valor y monitoree nuevamente

watch money

(3) Verifique si el valor monitoreado ha cambiado. Si no hay cambios, la ejecución puede ser exitosa y si hay cambios, la ejecución fallará.

exec

3. Jedis

1. Introducción

Jedis es un cliente redis basado en Java que integra operaciones de comando redis y proporciona administración del grupo de conexiones.

2. Dependencia

2.1 Dependencias principales

Utilizado para la conexión redis

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<!-- jedis库 -->
<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
   <version>4.2.3</version>
</dependency>

2.2 Dependencias secundarias

Usado para operaciones json

<!--HUTool工具-->
<dependency>
   <groupId>cn.hutool</groupId>
   <artifactId>hutool-all</artifactId>
   <version>5.8.9</version>
</dependency>

2. muestra

@Test
void contextLoads() {
    
    
    // 1、new jedis对象
    Jedis jedis = new Jedis("127.0.0.1",6379);
    System.out.println(jedis.ping());
}

resultado
inserte la descripción de la imagen aquí

3. Comandos relacionados con operaciones básicas.

Dado que el blog anterior escribió un comando muy completo, el conocimiento más completo de Redis en 2022 sobre los cinco tipos de datos básicos y comandos de shell,
por lo que el funcionamiento de jedis se escribe aproximadamente a continuación, solo para comprenderlo.

@Test
void testAll(){
    
    
    // 1、new jedis对象
    Jedis jedis = new Jedis("127.0.0.1",6379);
    System.out.println("清空数据:" + jedis.flushDB());
    System.out.println("新增键值对:" + jedis.set("name", "zhangsan"));
    System.out.println("判断某个数据是否存在:" + jedis.exists("name"));
    System.out.println("查看系统中所有的键:");
    Set<String> keys = jedis.keys("*");
    System.out.println(keys);
    System.out.println("删除键:" + jedis.del("name"));
}

resultado
inserte la descripción de la imagen aquí

4. Operaciones relacionadas con transacciones

@Test
void test2(){
    
    
    // 1、new jedis对象
    Jedis jedis = new Jedis("124.223.218.196",6379);
    jedis.flushDB();
    JSONObject jsonObject = new JSONObject();
    jsonObject.set("hello", "world");
    jsonObject.set("name", "zhangsan");

    // 开启事务
    Transaction multi = jedis.multi();
    String result = jsonObject.toString();

    try{
    
    
        multi.set("user1", result);
        multi.set("user2", result);
        // 执行事务
        multi.exec();
    }catch (Exception e) {
    
    
        // 放弃事务
        multi.discard();
        e.printStackTrace();
    }finally {
    
    
        System.out.println(jedis.get("user1"));
        System.out.println(jedis.get("user2"));
        // 关闭连接
        jedis.close();
    }
}

resultado
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_46106857/article/details/128335211
Recomendado
Clasificación