1 Redis事务
Redis事务首先使用MULTI命令告诉Redis开始一个事务操作,然后将在这个事务中需要执行的操作发给Redis,当所有命令发送完毕后,使用EXEC告诉Redis开始执行这一组操作,Redis保证一个事务中的所有命令要么都执行,要么都不执行。
- 错误处理:
- 语法错误:语法错误指命令不存在或者命令参数的个数不对,此时Redis不会执行任何操作
- 运行错误:运行错误指在命令执行时出现的错误,Redis无法发现,但是Redis此时会执行其他正确的操作。
- 注意:
- Redis没有提供回滚操作
- Redis并没有完全实现事务的原子操作
命令 | 作用 |
---|---|
MULTI | 标记一个事务块的开始 |
EXEC | 执行所有事务块内的命令 |
DISCARD | 取消事务,放弃执行事务块内的所有命令 |
WATCH key [key …] | 监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断 |
UNWATCH | 取消WATCH命令对所有key的监视 |
2 Redis持久化
Redis的强劲性能很大程度上是由于其将所有数据都存储在了内存,为了使Redis在重启之后任能保证数据不丢失,需要将数据从内存中以某种形式同步到磁盘中,Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。
3.1 RDB方式
RDB方式的持久化是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数——当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是Redis默认采用的持久化方式,存储的是压缩后的二进制数据。配置文件中以关键字save指定快照条件。
Redis默认会将快照文件存储在当前目录的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路劲和文件名。
- 快照的过程如下:
- Redis使用fork函数复制一份当前进程的副本
- 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入到磁盘中的临时文件
- 当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。
除了自动快照,还可以手动发送SAVE或BGSAVE命令让Redis执行快照,两个命令的区别在于,前者是由主进程进行快照操作,会阻塞其它请求,后者会通过fork子进程进行快照操作。Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存中。
3.2 AOF方式
默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启,开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入磁盘中的AOF文件,AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。AOF文件是纯文本文件。Redis允许同时开启RDB和AOF方式。