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事务三特性
① 单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
② 没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
③ 不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!