Redis事务使用教程
•技术分享
948 0
可以用使用redis事务做成乐观锁等
Redis 事务本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!
次性、顺序性、排他性!执行一些列的命令!
----- 队列 set set set 执行 ------
Redis事务没有没有隔离级别的概念 !
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec
Redis单条命令式保存原子性的,但是事务不保证原子性 !
redis的事务:
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.
如果事务队列中语法错误那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常!
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"
悲观锁:
乐观锁 :
正常测试执行成功
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
如果修改失败获取最新的值即可
版权属于:戏人看戏博客网
本文链接:https://day.nb.sb/archives/1237.html
若无注明均为戏人看戏原创,转载请注明出处,感谢您的支持!