Redis的事务(部分支持)

来源:互联网 发布:防止网络诈骗的小品 编辑:程序博客网 时间:2024/05/08 02:21
假期过了,赶紧来更新一下东东,最近项目一直处于上线阶段,每天加班调试优化模块功能,导致好几天回到家已经是后半夜了。好了,言归正传。

关于Redis事务一些小小的总结

    一说到事务,肯定想到的是像传统关系型数据库那样,要么全部成功,要么全部失败。事务的四大特性ACID信手拈来。但这里对不起了,Redis事务可跟关系型数据库不太一样了,因为它只是部分支持事务,下文会详细的说明。    是什么?可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他事务插入,不许加塞    能干嘛?一个队列中,一次性,顺序性,排他性的执行一系列命令    怎么玩?开启事务使用MULTI,但不见得开启,redis会返回ok代表我收到了,所有命令使用EXEC调用,使用DISCARD放弃事务,表示不玩了

常用的命令有:
WATCH key(keys) 监视一个或多个key,如果在事务执行之前这个或这些key被其他命令所改动,那么事务将被打断
MULTI 标记一个事务块的开始
EXEC 执行所有事务块内的命令
DISCARD 取消事务,放弃执行事务块内的所有命令
UNWATCH 取消WATCH 命令对所有 key 的监控
1:正常执行 MULTI … EXEC
2:放弃事务 DISCARD
3:全体连坐 要么全部成功,要么全部失败,命令错误
4:冤头债主 命令正确,但执行失败报错
5:watch监控:

  1. 悲观锁/乐观锁/CAS(check and set)
    悲观锁:锁整张表,性能极差,但一致性很高
    乐观锁:为了即保证高并发,又保证不说整张表,在每条记录后面加一个version版本号
  2. 无加塞篡改,先监控在开启MULTI,保证两笔金额变动在同一个事务内
  3. 有加塞篡改,横刀夺爱,先watch key 修改value 别人改了 那么失败了。 如果我知道别人改了,我先unwatch 在watch 在multi 然后修改 在exec提交执行

三个阶段:
1. 开启:以MULTI开始一个事务
2. 入队:将多个命令入队到事务中,找到这些命令并不会立即执行,而是放到等待执行事务队列里面
3. 执行:由EXEC命令触发事务
三个特性:单独的隔离操作:事务的所有命令都会序列化、按顺序地实行
没有隔离级别的概念:事务提交前任何指令都不会被实际执行
不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,不回滚

0 0