Redis事务使用教程

技术分享
1177 0

事务

可以用使用redis事务做成乐观锁等
Redis 事务本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!
次性、顺序性、排他性!执行一些列的命令!

----- 队列 set set set 执行 ------

Redis事务没有没有隔离级别的概念 !
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec
Redis单条命令式保存原子性的,但是事务不保证原子性 !
redis的事务:

  • 开启事务 (multi)
  • 命令入队 (....)
  • 执行事务 (exec)

multi 开启redis事务

exec 提交事务

discard 取消事务

watch 监视键值对,作用时如果事务提交exec时发现监视的监视对发生变化,事务将被取消。

正常执行事务

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 v1
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) "v1"
4) OK

放弃事务

127.0.0.1:6379(TX)> set k1 v11
QUEUED
127.0.0.1:6379(TX)> set k2 v11
QUEUED
127.0.0.1:6379(TX)> set k4 v44
QUEUED
127.0.0.1:6379(TX)> discard  #取消事务
OK
127.0.0.1:6379> get k4
(nil)

编译型异常

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v11
QUEUED
127.0.0.1:6379(TX)> set k2 v11
QUEUED
127.0.0.1:6379(TX)> gttt k3 v33 #其中命令输入错误
(error) ERR unknown command `gttt`, with args beginning with: `k3`, `v33`, 
127.0.0.1:6379(TX)> set k4 v44
QUEUED
127.0.0.1:6379(TX)> exec  #所有命令都不会运行
(error) EXECABORT Transaction discarded because of previous errors.

运行时异常(1/0)

如果事务队列中语法错误那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常!

127.0.0.1:6379> set k1 v1 
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incr k1  #因为k1不是数字
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)> exec
1) (error) ERR value is not an integer or out of range#第一条命令错误,其他命令执行成功
2) OK
3) "v2"

监控

悲观锁:

  • 很悲观,认为什么时候都会出问题,无论做什么都会加锁 !

乐观锁 :

  • 很乐观,认为什么时候都不会出问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据
  • 获取version
  • 更新的时候比较 version

正常测试执行成功

127.0.0.1:6379> set money 10
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> incrby meney 20
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 20

测试多线程修改值,使用watch 可以当做redis的乐观锁操作 !

127.0.0.1:6379> watch money #监视 money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> INCRBY money  10
QUEUED
127.0.0.1:6379(TX)> exec #执行之前,另外一个线程,修改了我们的值,这个时候,就会导致事务执行失败!
(nil)
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(TX)> DECRBY money 1
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 29

如果修改失败获取最新的值即可

最后更新 2023-07-28
评论 ( 0 )
OωO
隐私评论