Redis是一个开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,它常被用作数据库、缓存和消息中间件,在Redis中,事务是一组命令的集合,这些命令要么全部执行,要么全部不执行。
1. Redis事务的基本概念
Redis事务主要涉及以下三个命令:
MULTI:标记一个事务块的开始。
EXEC:执行所有事务块内的命令。
DISCARD:取消事务,放弃执行事务块内的所有命令。
2. WATCH命令
WATCH命令用于在事务开始之前监视任意数量的键,如果在事务执行之前这些键的值发生了变化,那么事务将被中断。
语法:
WATCH key [key ...]
示例:
> WATCH mykey OK
3. MULTI命令
MULTI命令用于开启一个事务,它总是返回OK,MULTI之后的所有命令都会进入队列中,等待EXEC命令来执行。
语法:
MULTI
示例:
> MULTI OK
4. EXEC命令
EXEC命令用于执行所有在MULTI之后进入到队列的命令,当调用EXEC时,进入队列的命令会按顺序执行,每次调用EXEC时,每个由MULTI和WATCH命令保护的键都会被重新观察一次,如果有键的值在事务开始之后发生了改变,那么所有监视这个键的后续命令都不会被执行,如果所有命令都被成功执行,那么EXEC返回OK,否则返回空值nil。
语法:
EXEC
示例:
> MULTI OK > SET mykey "Hello" QUEUED > EXEC OK 1) OK 表示mykey的值被成功设置为了"Hello"
5. DISCARD命令
DISCARD命令用于取消事务,放弃执行事务块内的所有命令,如果正在使用WATCH命令监视某个(或某些)键,那么取消所有监视的键,如果当前没有事务在进行,DISCARD命令不做任何事情并返回OK,如果正在运行事务,那么该命令会先取消所有的监控键,然后中断事务并返回OK,注意,如果调用DISCARD时有未提交的事务,那么DISCARD不会回滚任何已经作出的改变,要强制回滚所有未提交的改变,需要调用ABORT命令。
语法:
DISCARD [key [key ...]]
示例:
> MULTI OK > SET mykey "Hello" 此时mykey的值被设置为"Hello",但还未真正写入到Redis服务器中,因为还没有调用EXEC命令来执行这个操作。 QUEUED 表示mykey的值被成功设置为了"Hello",但还未真正写入到Redis服务器中,因为还没有调用EXEC命令来执行这个操作。 > DISCARD 取消所有监视的键,并中断事务,此时mykey的值不会被真正写入到Redis服务器中,因为还没有调用EXEC命令来执行这个操作。