Redis事务
基本语法
- MULTI
- 开启事务, 后续的命令会被加入到同一个事务中
- 事务中的操作会发给服务端, 但是不会立即执行, 而是放到了该事务的对应的一个队列中, 服务端返回QUEUED
- EXEC
- 执行EXEC后, 事务中的命令才会被执行
- 事务中的命令出现错误时, 不会回滚也不会停止事务, 而是继续执行
- DISCARD
- 取消事务, 事务队列会清空, 客户端退出事务状态
$ redis-cli 127.0.0.1:6379> set user1 zs # 设置string类型的键 user1 OK 127.0.0.1:6379> type user1 # 查看user1类型 string 127.0.0.1:6379> multi # 开启事务 OK 127.0.0.1:6379> set age 20 # 设置string类型的键 age, 事务中的操作不会立即执行, 只是入列 QUEUED 127.0.0.1:6379> hset user1 name zs # 设置hash类型的键 user1, 由于user1已存在, 且为string类型, 所以在该命令真正执行时会报错, 此处仅为入列 QUEUED 127.0.0.1:6379> set height 1.8 # 设置string类型的键 height OK 127.0.0.1:6379> exec # 提交事务, 即使部分操作失败, 不回滚且继续执行 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) OK
ACID
- 原子性
- 不支持
- 不会回滚并且继续执行
- 隔离性
- 支持
- 事务中命令顺序执行, 并且不会被其他客户端打断 (先EXEC的先执行)
- 单机redis读写操作使用 单进程单线程
- 持久性
- 支持, 但相比Mysql, redis数据易丢失
- 一致性
- 不支持
from redis import StrictRedis #创建redis客户端 redis_client = StrictRedis() #创建管道对象,开启事务 pipe = redis_client.pipeline() a = pipe.set('name','zhangsan') b = pipe.get('name') pipe.execute()
注意点:
- 创建管道后, 默认会开启事务
- 放入事务中的命令在执行
execute
方法后才会执行