Redis 的事务是如何实现的?

Redis支持事务的机制是通过多条命令打包执行来实现的。主要包括以下步骤:

  1. 客户端开始一个事务,Redis记录下事务的开始。
MULTI  # 标记事务开始
  1. 客户端往事务中添加多个命令。
SET key1 value1
LPUSH list1 value2
...
  1. 客户端执行事务。
EXEC  # 执行事务

4.Redis把事务中的所有命令放入队列执行。

  1. 执行结果返回给客户端。
+OK        # 所有命令执行成功
-ERR ...   # 有命令执行失败
  1. 事务支持回滚。
DISCARD # 回滚事务,不执行任何命令 
  1. 事务的隔离性。
    在事务执行期间,不会影响其他命令。

一个典型的例子:

 MULTI   
 INCR mycounter     # 事务1  
 INCR mycounter     # 事务2  
 INCR mycounter     # 事务3
 EXEC              

最后mycounter增加的次数仍然只有1。

举个Java API的例子:

conn.multi();   // 开始事务
conn.set("key1", "value1");
conn.set("key2", "value2");
List<Object> result = conn.exec();  // 执行事务,返回结果
redis.clients.jedis.Transaction这个类也可以方便地实现Redis的事务。