redis的事务-redis系列教程

概述

redis的事务就是一组命令的集合,它们被顺序的执行,如果取消事务的执行那么事务中的命令全部都不会执行。

这里写图片描述

  • redis的事务仅仅是保证事务里的操作会被连接独占的执行,因为是单线程架构所以在执行完事务内的所有指令前是不可能再去同时执行其他客户端的请求。
  • redis的事务没有隔离级别的概念,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题。
  • redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只能决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力。

事务的基本过程

这里写图片描述

  1. 发送一个事务的命令 multi 给redis;
  2. 依次发送要执行的命令给redis,redis接收到这些命令后并不会立即执行,而是放到等待执行的事务队列里面;
  3. 发送执行事务的命令 exec 给redis。
  4. redis保证一个事务内的命令依次执行,而不会被其它命令插入到中间;
  5. 如果想放弃事务使用命令 discard

事务过程中的错误处理

  1. 如果任何一个命令语法有错,redis会直接返回错误,所有的命令都不会执行。
  2. 如果某个命令执行错误,那么其它的命令仍然会正常执行,然后在执行后返回错误信息。
  3. redis不提供事务回滚的能力,开发者必须在事务执行出错后自行恢复数据库状态。

事务操作的基本命令

  • multi 开启事务
  • exec 执行事务
  • discard 放弃事务
  • watch 监控键值。如果键值被修改或删除,后面的一个事务就不会执行。
  • unwatch 取消watch

Watch说明

  1. redis使用watch来提供乐观锁定,类似于CAS(check-and-set)
  2. watch可以被调用多次
  3. 当exec被调用后所有之前被监视的键值会被取消监视,不管事务是否被取消或者执行。并且当客户端连接丢失的时候所有东西都会被取消监视。

示例

127.0.0.1:6379[2]> set key1 a
OK
127.0.0.1:6379[2]> set key2 b
OK
127.0.0.1:6379[2]> keys *
1) "key1"
2) "key2"
127.0.0.1:6379[2]> multi
OK
127.0.0.1:6379[2]> set key1 aaa
QUEUED
127.0.0.1:6379[2]> set key2 bbb
QUEUED
127.0.0.1:6379[2]> exec
1) OK
2) OK
127.0.0.1:6379[2]> get key1
"aaa"
127.0.0.1:6379[2]> get key2
"bbb"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值