Transação e monitoramento em Redis (bloqueio otimista)

Negócios

A essência da transação Redis:

Uma coleção de comandos. Todos os comandos em uma transação serão serializados e serão executados em sequência durante a execução da transação.

Redis características da transação:

  • Uma vez
  • Sequencial
  • Exclusividade

As transações Redis não têm conceito de nível de isolamento

Todos os comandos não são executados diretamente na transação; o Exec só será executado quando o comando de execução for iniciado

O comando único Redis tem atomicidade garantida, mas transações não são atomicidade garantida!

Redis affairs

  1. Iniciar transação (multi)
  2. Ordem para se juntar à equipe (....)
  3. Transação de execução (exec)
127.0.0.1:6379> multi    #开启事务
OK
#命令入队
127.0.0.1:6379> set k1  v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec  #执行事务
1) OK
2) OK
3) OK
4) "v3"

Desistir

127.0.0.1:6379> multi   #开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> discard    #取消事务
OK
127.0.0.1:6379> get k4    #事务队列中的命令都不会被执行
(nil)

Duas anormalidades

1. exceção de compilação (o comando está errado), todos os comandos na transação não serão executados

127.0.0.1:6379> multi  
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> getset k3   #错误命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> exec  #执行是事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k4   #所有的命令都不会执行
(nil) 

2. Exceção de tempo de execução (1/0), se houver gramatical na fila de transações, ao executar o comando, outros comandos podem ser executados normalmente, o comando errado lança uma exceção.

127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1  #字符串自增1 会执行失败
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range  #虽然第一条命令报错了,但是还是正常执行成功了
2) OK
3) OK
127.0.0.1:6379> get k2
"v2"


Monitor Watch (Perguntas frequentes sobre entrevistas)

Bloqueio pessimista:

Muito pessimista, pensando que haverá problemas a qualquer momento, não importa o que esteja bloqueado

Bloqueio otimista:

Estou muito otimista e acho que não haverá problemas a qualquer momento, por isso não será bloqueado .. Ao atualizar os dados, julgue se alguém modificou esses dados durante esse período.

assistir uso

  • Obter versão
  • Compare a versão ao atualizar
  • Teste de monitoramento de teste Redis

A execução normal é bem-sucedida:

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

Teste os valores de modificação multithread, use watch como operação de bloqueio otimista para redis

127.0.0.1:6379> watch money   #监视money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby moeney 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec   #执行之前,另外一个线程修改了money的值,就会导致事务执行失败!
(nil)

Falha na modificação:

  1. Se for constatado que a execução da transação falha, ela é desbloqueada primeiro
  2. Obtenha o valor mais recente e monitore novamente
  3. Verifique se o valor monitorado mudou. Se não houver alteração, ele poderá ser executado. Se a alteração falhar, a execução continuará e continuará a desbloquear e monitorar novamente.
127.0.0.1:6379> unwatch   #如果发现事务执行失败,就先解锁
OK
127.0.0.1:6379> watch money    #获取最新的值,再次监视
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 60
QUEUED
127.0.0.1:6379> incrby out 60
QUEUED
127.0.0.1:6379> exec  #比对监视的值是否发生变化,如果没有发生变化,可以执行,如果变化就执行失败,继续解锁再次监视。
1) (integer) 1020
2) (integer) 80

 

Publicado 323 artigos originais · 61 elogios · Mais de 70.000 visualizações

Acho que você gosta

Origin blog.csdn.net/wan_ide/article/details/105483912
Recomendado
Clasificación