事务
-
操作
# ex,过期时间(秒) # px,过期时间(毫秒) # nx,如果设置为True,则只有name不存在时,当前set操作才执行 # xx,如果设置为True,则只有name存在时,当前set操作才执行 redis_client.set('name', 'zs', ex=10)
-
事务:
-
语法:
MULTI (multi):开启事务,后续的命令会被加入同一个事务中。 事务中的操作会发送给服务端,但是不会立即执行, 而是放到了该事务的对应的一个队列中,服务端返回QUEUED
EXEC (exec):python文件引用中是execute,执行EXEC后,事务中的命令才会被执行,事务中的命令出现错误时,不会回滚也不会停止事务, 而是继续执行。
DISCARD(discard):取消事务,事务队列会清空,客户端退出事务状态
-
ACID:
**原子性:**不支持。不会回滚并且继续执行
**隔离性:**支持。事务中命令顺序执行,并且不会被其他客户端打断(先EXEC的先执行)。单机redis读写操作使用 单进程单线程
**持久性:**不支持,因为redis数据容易丢失
**一致性:**不支持。 强一致性要求,可以通过乐观锁(watch)来实现
-
WATCH:
- redis机制的乐观锁
- 机制:事务开启前,设置对数的监听,EXEC时,如果发现数据发生过修改,事务会自动取消(DISCARD)。事务EXEC后,无论成败,监听会被移除。
-
setnx和悲观锁
- setnx键不存在,才会设置成功
-
非事务性管道
- redis实现了管道机制,可以将多个操作打包发给redis服务器
- 可以单独使用管道,不需要开启事务 对于没有事务要求的多个操作,可以直接使用非事务性管道进行处理,减少事务产生的性能消耗。
- 创建非事务性管道,通过transaction=False参数设置
-