持久化分为两种方式:RDB和AOFredis
1.1 RDB模式数据库
RDB方式的持久化是经过快照(snapshotting)完成的,当符合必定条件时Redis会自动将内存中的全部数据进行快照并存储在硬盘上。进行快照的条件能够由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是Redis默认采用的持久化方式,在配置文件中已经预置了3个条件:缓存
save 900 1 # 900秒内有至少1个键被更改则进行快照
save 300 10 # 300秒内有至少10个键被更改则进行快照 save 60 10000 # 60秒内有至少10000个键被更改则进行快照
能够存在多个条件,条件之间是“或”的关系,只要知足其中一个条件,就会进行快照。 若是想要禁用自动快照,只须要将全部的save参数删除便可。安全
Redis默认会将快照文件存储在当前目录(可CONFIG GET dir来查看)的dump.rdb文件中,能够经过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。bash
Redis实现快照的过程服务器
在执行fork的时候操做系统(类Unix操做系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令 ),操做系统会将该片数据复制一份以保证子进程的数据不受影响,因此新的RDB文件存储的是执行fork一刻的内存数据。app
Redis在进行快照的过程当中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任什么时候候RDB文件都是完整的。这使得咱们能够经过定时备份RDB文件来实 现Redis数据库备份。RDB文件是通过压缩(能够配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,因此占用的空间会小于内存中的数据大小,更加利于传输。函数
除了自动快照,还能够手动发送SAVE或BGSAVE命令让Redis执行快照,两个命令的区别在于,前者是由主进程进行快照操做,会阻塞住其余请求,后者会经过fork子进程进行快照操做。 Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不一样,这个时间也不一样。一般将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内 存中须要花费20~30秒钟。 经过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照之后更改的全部数据。这就须要开发者根据具体的应用场合,经过组合设置自动快照条件的方式来将可能发生的数据损失控制在可以接受的范围。若是数据很重要以致于没法承受任何损失,则能够考虑使用AOF方式进行持久化。性能
redis Save 命令基本语法以下:spa
redis 127.0.0.1:6379> SAVE
redis 127.0.0.1:6379> SAVE OK
该命令将在 redis 安装目录中建立dump.rdb文件。
若是须要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务便可。获取 redis 目录可使用 CONFIG 命令,以下所示:
redis 127.0.0.1:6379> CONFIG GET dir 1) "dir" 2) "/usr/local/redis/bin"
以上命令 CONFIG GET dir 输出的 redis 安装目录为 /usr/local/redis/bin。
2.AOF
AOF方式
默认状况下Redis没有开启AOF(append only file)方式的持久化,能够在redis.conf中经过appendonly参数开启:
appendonly yes
在启动时Redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是经过dir参数设置的,默认的文件名是appendonly.aof,能够经过appendfilename参数修改:
appendfilename appendonly.aof
配置redis自动重写AOF文件的条件
auto-aof-rewrite-percentage 100 # 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,若是以前没有重写过,则以启动时的AOF文件大小为依据
auto-aof-rewrite-min-size 64mb # 容许重写的最小AOF文件大小
配置写入AOF文件后,要求系统刷新硬盘缓存的机制
# appendfsync always # 每次执行写入都会执行同步,最安全也最慢
appendfsync everysec # 每秒执行一次同步操做 # appendfsync no # 不主动进行同步操做,而是彻底交由操做系统来作(即每30秒一次),最快也最不安全
Redis容许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操做十分容易。此时从新启动Redis后Redis会使用AOF文件来恢复数据,由于AOF方式的持久化可能丢失的数据更少