redis学习(六)之事务和锁机制

Redis的事务定义

Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。

multi、exec、discard命令

在Redis中从输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入exec后,Redis会将之前的命令队列中的命令依次执行。
在组队的过程中可以通过discard来放弃组队,这样先前输入的命令也都将不会执行。这个过程的示意图如下:

 

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 事务被成功执行
 
redis 127.0.0.1:6379> MULTI
OK
 
redis 127.0.0.1:6379> set key1 value1
QUEUED
 
redis 127.0.0.1:6379>set key2 value2
QUEUED
 
 
redis 127.0.0.1:6379> EXEC
 
# 事务被放弃执行
 
redis 127.0.0.1:6379> MULTI
OK
 
redis 127.0.0.1:6379> set key1 value1
QUEUED
 
redis 127.0.0.1:6379>set key2 value2
QUEUED
 
redis 127.0.0.1:6379>  discard

事务的错误处理

在组队的过程中如果某个命令出现了错误报告,那么执行exec时整个的命令队列都会被取消,即所有的命令都不会成功执行。这个过程的示意图如下:

 

实例:

1
2
3
4
5
6
7
8
9
10
11
12
#发起事务
multi
 
#添加数据
set  b1 v1
set b2 v2
#组队
set b3
错误命令
#推出
exec
#报错有一个错了都不会执行

如果在执行阶段的某个命令报出了错误(比如对一个非整数型的值进行incr自增),则执行exec时只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。这个过程的示意图如下:

 

 实列:

1
#发起实列<br>mulit<br>#添加<br>set c1 v1<br>c1+1<br>inc c1<br>#组队<br>set c2 v2<br>#组队正确<br>exec<br>#保存C1不能+1

事务冲突(乐观锁和悲观锁)

当前有10000元,一个请求消费8000,一个请求消费5000,一个请求消费1000

 

导致结果为-4000.

对于以上事务冲突问题,我们通过加锁的方式解决

悲观锁
即很悲观,每次去拿数据时都认为别人会修改,所以在每次获取数据时都上锁,使别人无法获取数据直至你使用完写回为止。

传统的关系型数据库里面用到了很多这种锁机制,比如行锁、表锁、读锁、写锁,都是在进行操作之前先上锁

缺点:效率较低,只能一个人一个人的使用

   

乐观锁
即比较乐观,每次拿数据时都认为别人不会修改,所以不进行上锁,但是在更新时会判断一下在此期间有没有人去更新这个数据(采用版本号机制)。

乐观锁适用于读操作较多的应用类型,提高吞吐量。例如:抢票

利用check-and-set机制实现事务

 

 

WATCH key[key...](乐观锁的使用)
在执行multi之前,先执行watch key1 [key2]来监视一个或多个key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

例:在第一个窗口中对balance进行修改自动打断第二个窗口中的事务

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#使用两个黑窗口进行测试(添加测试数据:只需要一个黑窗口)
set balane 100
#查看所有的key(两个黑窗口都需要)
keys *
#监视两个都要
watch balance
#两个黑窗口开启事务
mulit
#其中一个对其操作
incrby balance 10
#另一个操作
incrby balance 20
#执行
exec
其中一个又nil

unwatch:取消对所有key监控

Redis事务三特性

① 单独的隔离操作

事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

 

② 没有隔离级别的概念

队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。

 

③ 不保证原子性

事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

 

 

posted @   永远爱芒果  阅读(114)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示