Redis之三:事务

Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务的执行过程期间,服务器不会中断事务而去执行客户端的其他请求。

事务的实现

一个事务从开始到结束通常会经历三个阶段:

  1. 事务开始:MULTI标志着一个事务的开始;
  2. 命令入队:当一个客户端处于非事务状态时,客户端发来的命令会立即被服务器所执行;当一个客户端切换到事务状态时,服务器会根据客户端发来的不同命令执行不同的操作:

    • 如果客户端发送的命令为EXEC、DISCARD、WATCH、MULTI四个命令中的其中一个,那么服务器会立即执行此命令。
    • 如果不是上述的四个命令,那么服务器不会立即执行这个命令,而是将此命令放入到一个事务队列里,然后向客户端返回QUEUED回复。
  3. 执行事务:当一个处于事务状态的客户端向服务器发送EXEC命令时,这个EXEC命令会立即被执行。服务器会遍历这个客户端的事务队列,依次执行所有的命令。

WATCH命令的实现

WATCH命令是一个乐观锁,它可以在EXEC命令执行之前,监视任意数量的数据库键,并在执行EXEC命令时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务,并向客户端返回代表事务执行失败的空回复。

使用WATCH命令监视数据库键

每个Redis数据库都保存着一个watched_key字典,这个字典的键是某个被WATCH命令监视的数据库键,而字典的值是一个链表,链表中记录了所有监视相应数据库键的客户端。

监视机制的触发

所有对数据库修改的命令,在执行之后都会调用mulit.c/touchWatchKey函数对watched_keys字典进行检查,如果存在监视的数据库键的修改,就将对应的客户端的REDIS_DIRTY_CAS标识打开,标识该客户端的事务安全性遭到了破坏。

判断事务是否安全

当客户端接收到EXEC命令时,服务器将根据这个客户端是否打开了REDIS_DIRTY_CAS标识来决定是否执行事务。

事务的ACID性质

在Redis中,事务总是具有原子性(Atomicity)、一致性(Consistency)和隔离性(Isolation),并且当Redis运行在某种特定的持久化模式下,事务也具有耐久性(Durability)。

  • 原子性:事务队列中的命令要么全部执行,要么就一个也不执行,所以具有原子性。
  • 一致性:事务的一致性是指,如果数据库在执行事务之前是一致的,那么在事务执行之后,无论事务是否执行成功,数据库也应该仍然是一致的。“一致”指的是数据符合数据库本身的定义和要求,没有包含非法或者无效的错误数据。
  • 隔离性:事务的隔离性是指,即使数据库中有多个事务并发地执行,各个事务之前也不会互相影响,并且在并发状态下执行的事务和串行执行的事务产生的结果相同。Redis本身就是单线程的方式执行事务的,因此Redis的事务总是以串行的方式执行的,因此具有隔离性。
  • 耐久性:事务的耐久性指的是,当一个事务执行完毕时,执行这个事务所得的结果已经被保存到永久性存储介质中,即使服务器在事务执行完毕之后停机,执行事务所得的结果也不会丢失。对于Redis来说,只有服务器运行在AOF持久化模式之下,并且appendfsync选项的值为always时,事务才具有耐久性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值