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> 验证

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

## 优点
- 使用默认,使用事务进行操作。
使用以下命令组合,每次执行命令会从zset中弹出一个分数最小的元素
```shell
WATCH##
zset element = ZRANGE zset 0 0比MULTI
ZREMdzset element
EXEC
ps:这是官网的例子我没有实现成功,element = ZRAN zset 0 0
会执行失败。
事务与脚本
脚本可以实现事务功能,并且使用脚本更加方便,轻松。