redis-----事务
Redis 事务是一组命令的集合,它可以保证这些命令要么全部执行,要么全部不执行,从而确保数据操作的原子性。
Redis 事务主要通过以下几个命令实现:
- MULTI:标记一个事务块的开始
- EXEC:执行所有在事务块内的命令
- DISCARD:取消事务,放弃执行事务块内的所有命令
- WATCH:监视一个或多个键,如果在事务执行前这些键被其他命令修改,事务将被打断
watch要在MULTI之前使用
1.Redis 事务的基本流程:
127.0.0.1:6379> MULTI # 开始事务
OK
127.0.0.1:6379> SET a 1 # 命令入队
QUEUED
127.0.0.1:6379> SET b 2 # 命令入队
QUEUED
127.0.0.1:6379> GET a # 命令入队
QUEUED
127.0.0.1:6379> EXEC # 执行事务
1) OK
2) OK
3) "1"
2.事务的特点:
- 原子性:事务中的所有命令要么全部执行,要么全部不执行
- 隔离性:事务执行过程中,不会被其他客户端发送的命令干扰
- 没有回滚:如果事务中的某个命令执行失败,其他命令仍然会继续执行(这与传统数据库事务不同)
3.使用 WATCH 实现乐观锁:
127.0.0.1:6379> WATCH balance # 监视balance键
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR balance 100
QUEUED
127.0.0.1:6379> EXEC # 如果balance在WATCH后被修改,会返回nil
1) (integer) 200
4.注意事项:
- Redis 事务不支持传统数据库的回滚机制,如果某个命令执行失败,其他命令仍会继续执行
- 事务中的命令会按顺序执行,不会被其他客户端的命令插入(开启事务后,事务中的命令会存放在客户端本地的事务队列中,其他客户端的命令会被 Redis 单线程立即处理(除非当前正在执行阻塞命令)。通过事件循环机制逐个处理命令。当本地客户端exec开始执行事务时,,Redis 会将事务队列中的所有命令一次性取出并按顺序执行,执行期间会阻塞其他客户端的命令)
- WATCH 命令可以实现乐观锁,适合并发场景下的数据安全操作
- 事务执行期间,Redis 会阻塞其他客户端的请求,因此事务不宜包含过多命令
Redis 事务适合简单的原子性操作,对于复杂的事务需求,可能需要结合其他机制来实现。