redis事务

redis事务

​ 使用multi命令,输入多条命令后,这些命令会进入到队列中,不会立刻执行。再使用exec命令后,队列中的命令会按先后顺序执行。要么全部执行,要么全部不执行。即使其中发生了错误,也会执行剩余的命令。并且redis没有事务回滚功能。

事务示例

127.0.0.1:6379> multi
OK
127.0.0.1:6379> lpush user cjw 18 men
QUEUED
127.0.0.1:6379> set sag ttxs
QUEUED
127.0.0.1:6379> exec
1) (integer) 3
2) OK

命令入队时发生异常

命令入队时发生异常,在exec后,redis会放弃整个事务,所有命令都不会执行。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> lpush user age 18 
QUEUED
127.0.0.1:6379> lpushs user age 18 
(error) ERR unknown command `lpushs`, with args beginning with: `user`, `age`, `18`, 
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> set name cjw
OK

exec后出现异常

​ exec后,执行队列中的命令中,发生了异常,redis会继续执行后面的命令,并且不提供事务回滚。需要自己避免入队命令执行出现异常。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 17.5
QUEUED
127.0.0.1:6379> incr age 
QUEUED
127.0.0.1:6379> set name cjw
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK

使用discard取消事务

127.0.0.1:6379> set name cjw
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 17
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379> get name
"cjw"

使用watch实现check-and-set 乐观锁

​ 使用watch“看住’'某个key,在事务中获得/修改…该key时,会检测vule是否在事务外已经被修改,如果修改会返回nil,本次事务的所有命令都不会执行。

127.0.0.1:6379> get name
"cjw"
127.0.0.1:6379> 验证

![图片.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8zNDA1MTY1LTRmYWU2YjFkNmE3ZDJmMDAucG5n)

aof文件记录了增删改命令

![图片.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8zNDA1MTY1LWM5MTdkYTI2NzE5NmVi79> get name
"cjwNGMuc"n)```



##使用unw tch解锁key缩
- 使用不带参数的unwatch可以解锁所有的key。
- exec重,discard,关闭客户端也后解锁所有的key令。
``shell
127.0.0.1:6379> `et namg
"cjr2"
127.0.0.1:6379> wariteaof` 命令更新aof文件

![图片.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8zNDA1MTY1LTk0MzlmYmYyZmQyYzcyNWQucG5n)

## 优点

- 使用默认,使用事务进行操作。

使用以下命令组合,每次执行命令会从zset中弹出一个分数最小的元素

```shell
WATCH## 
zset element = ZRANGE zset 0 0比MULTI
ZREMdzset element
EXEC

ps:这是官网的例子我没有实现成功,element = ZRAN zset 0 0 会执行失败。

事务与脚本

脚本可以实现事务功能,并且使用脚本更加方便,轻松。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值