Redis事务详解
下文笔者将详细讲解事务的点点滴滴,如下所示
Redis事务
Redis事务同其它数据库中的事务概念一致,要么全部成功,要么全部失败 但是Redis事务有点小小的不同,他和别的数据库事务不同的地方在于 1.Redis单条命令是原子性的 2.Redis的事务并没有原子性 所以我们可将Redis事务理解为,并不是严格意义上的事务 而是Redis特有的事务
Redis事务简介
Redis事务: 是一个将多个脚本打包并批量执行脚本 redis事务不保证原子性,没有回滚 如果中间某条命令执行失败,前面已执行命令不回滚,后续的指令继续执行 Redis事务可一次执行多个命令,并拥有以下特性: 1.批量操作在发送 EXEC 命令前被放入队列缓存 2.收到 EXEC 命令后进入事务执行,事务中任意命令执行失败, 前面已执行的命令不回滚,后续的命令继续执行 3.事务在执行的过程中, 不会被其他客户端发送来的命令请求所打断 注意事项: Redis事务只保证了一致性(C)和隔离性(I) 但并不保证原子性(A)和持久性(D)
redis不支持回滚的缘由
Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现) 或命令用在了错误类型的键上面 所以redis的错误,可理解为编码上的失误 所以我们只需保证编码的正确,无需回滚
Redis事务三阶段
事务开始MULTI 命令入队 事务执行EXEC
Redis事务命令
序号 | 命令 | 备注 |
1 | WATCH | WATCH 命令是一个乐观锁 可以为 Redis 事务提供 check-and-set (CAS)行为 可以监控一个或多个键,一旦其中有一个键被修改(或删除) 之后的事务就不会执行 监控一直持续到EXEC命令 |
2 | UNWATCH | UNWATCH命令可以取消watch对所有key的监控 |
3 | MULTI | MULTI命令用于开启一个事务,它总是返回OK。 MULTI执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中, 当EXEC命令被调用时,所有队列中的命令才会被执行 |
4 | EXEC | EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值, 按命令执行的先后顺序排列。当操作被打断时,返回空值 nil |
5 | DISCARD | 通过调用DISCARD,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。