Redis有两种持久化的方式:快照(RDB
文件)和追加式文件(AOF
文件):redis
fork()
产生子进程进行数据的持久化,若是数据比较大的话可能就会花费点时间,形成Redis中止服务几毫秒。若是数据量很大且CPU性能不是很好的时候,中止服务的时间甚至会到1秒。默认Redis会把快照文件存储为当前目录下一个名为dump.rdb
的文件。要修改文件的存储路径和名称,能够经过修改配置文件redis.conf
实现:安全
# RDB文件名,默认为dump.rdb。 dbfilename dump.rdb # 文件存放的目录,AOF文件一样存放在此目录下。默认为当前工做目录。 dir ./
你能够配置保存点,使Redis若是在每N秒后数据发生了M次改变就保存快照文件。例以下面这个保存点配置表示每60秒,若是数据发生了1000次以上的变更,Redis就会自动保存快照文件:服务器
save 60 1000
保存点能够设置多个,Redis的配置文件就默认设置了3个保存点:app
# 格式为:save <seconds> <changes> # 能够设置多个。 save 900 1 #900秒后至少1个key有变更 save 300 10 #300秒后至少10个key有变更 save 60 10000 #60秒后至少10000个key有变更
若是想禁用快照保存的功能,能够经过注释掉全部"save"配置达到,或者在最后一条"save"配置后添加以下的配置:工具
save ""
默认状况下,若是Redis在后台生成快照的时候失败,那么就会中止接收数据,目的是让用户能知道数据没有持久化成功。可是若是你有其余的方式能够监控到Redis及其持久化的状态,那么能够把这个功能禁止掉。性能
stop-writes-on-bgsave-error yes
默认Redis会采用LZF
对数据进行压缩。若是你想节省点CPU的性能,你能够把压缩功能禁用掉,可是数据集就会比没压缩的时候要打。命令行
rdbcompression yes
从版本5的RDB的开始,一个CRC64
的校验码会放在文件的末尾。这样更能保证文件的完整性,可是在保存或者加载文件时会损失必定的性能(大概10%)。若是想追求更高的性能,能够把它禁用掉,这样文件在写入校验码时会用0
替代,加载的时候看到0
就会直接跳过校验。日志
rdbchecksum yes
Redis提供了两个命令用于手动生成快照。code
SAVE命令会使用同步的方式生成RDB快照文件,这意味着在这个过程当中会阻塞全部其余客户端的请求。所以不建议在生产环境使用这个命令,除非由于某种缘由须要去阻止Redis使用子进程进行后台生成快照(例如调用fork(2)
出错)。生命周期
BGSAVE命令使用后台的方式保存RDB文件,调用此命令后,会马上返回OK
返回码。Redis会产生一个子进程进行处理并马上恢复对客户端的服务。在客户端咱们可使用LASTSAVE命令查看操做是否成功。
127.0.0.1:6379> BGSAVE Background saving started 127.0.0.1:6379> LASTSAVE (integer) 1433936394
配置文件里禁用了快照生成功能不影响
SAVE
和BGSAVE
命令的效果。
快照并非很可靠。若是你的电脑忽然宕机了,或者电源断了,又或者不当心杀掉了进程,那么最新的数据就会丢失。而AOF文件则提供了一种更为可靠的持久化方式。每当Redis接受到会修改数据集的命令时,就会把命令追加到AOF文件里,当你重启Redis时,AOF里的命令会被从新执行一次,重建数据。
redis-check-aof
这个工具很简单的进行修复。FLUSHALL
命令把全部数据刷掉了,只要文件没有被重写,咱们能够把服务停掉,把最后那条命令删掉,而后重启服务,这样就能把被刷掉的数据恢复回来。把配置项appendonly
设为yes
:
appendonly yes
# 文件存放目录,与RDB共用。默认为当前工做目录。 dir ./ # 默认文件名为appendonly.aof appendfilename "appendonly.aof"
你能够配置Redis调用fsync的频率,有三个选项:
推荐使用每秒fsync一次的方式(默认的方式),由于它速度快,安全性也不错。相关配置以下:
# appendfsync always appendfsync everysec # appendfsync no
随着写操做的不断增长,AOF文件会愈来愈大。例如你递增一个计数器100次,那么最终结果就是数据集里的计数器的值为最终的递增结果,可是AOF文件里却会把这100次操做完整的记录下来。而事实上要恢复这个记录,只须要1个命令就好了,也就是说AOF文件里那100条命令其实能够精简为1条。因此Redis支持这样一个功能:在不中断服务的状况下在后台重建AOF文件。
工做原理以下:
咱们能够经过配置设置日志重写的条件:
# Redis会记住自从上一次重写后AOF文件的大小(若是自Redis启动后还没重写过,则记住启动时使用的AOF文件的大小)。 # 若是当前的文件大小比起记住的那个大小超过指定的百分比,则会触发重写。 # 同时须要设置一个文件大小最小值,只有大于这个值文件才会重写,以防文件很小,可是已经达到百分比的状况。 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
要禁用自动的日志重写功能,咱们能够把百分比设置为0:
auto-aof-rewrite-percentage 0
Redis 2.4以上才能够自动进行日志重写,以前的版本须要手动运行BGREWRITEAOF这个命令。
若是由于某些缘由(例如服务器崩溃)AOF文件损坏了,致使Redis加载不了,能够经过如下方式进行修复:
使用redis-check-aof
命令修复原始的AOF文件:
$ redis-check-aof --fix
diff -u
命令看下两个文件的差别。这里只说Redis >= 2.2版本的方式:
dump.rdb
的文件,并把备份文件放在一个安全的地方。运行如下两条命令:
$ redis-cli config set appendonly yes $ redis-cli config set save ""
确保数据跟切换前一致。
第二条命令是用来禁用RDB的持久化方式,可是这不是必须的,由于你能够同时启用两种持久化方式。
记得对配置文件
redis.conf
进行编辑启用AOF,由于命令行方式修改配置在重启Redis后就会失效。