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
- Iniciar transação (multi)
- Ordem para se juntar à equipe (....)
- 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:
- Se for constatado que a execução da transação falha, ela é desbloqueada primeiro
- Obtenha o valor mais recente e monitore novamente
- 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