前面已经总结了Redis 的安装和使用今天讲下Redis 的持久化。
redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来持久化,以确保redis 的数据安全。
redis持久化的两种方式
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是将存储的数据快照的方式存储到磁盘上,
AOF,则是将redis执行过的所有写指令记录下来,通过write函数追加到AOF文件的末尾。在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
RDB
RDB(Redis DataBase),是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。默认的文件名为dump.rdb。
redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件,以确保数据完整可用。
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
不过,由于快照方式是在一定间隔时间做一次的,如果对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每2分钟都持久化一次,当redis故障时,仍然会有近2分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。
AOF
AOF(Append Only File),即只允许追加不允许改写的文件。
Redis会将收到的每一个写操作(如SET等)通过write函数追加到AOF文件的末尾。默认的AOF持久化策略是每秒钟fsync一次(把缓存中的写指令记录到磁盘中)。
当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
appendonly yes #启用aof持久化方式 # appendfsync always #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用 appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 # appendfsync no #完全依赖os,性能最好,持久化没保证
但AOF方式是将所有的命令记录下来,所以AOF文件要比RDB文件的体积大。而且,恢复速度也要慢于RDB方式。
redis提供了bgrewriteaof命令,会重新生成一个全新的AOF文件,其中便包括了可以恢复现有数据的最少的命令集。
需要注意到是重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
如何选择RDB和AOF
对于我们应该选择RDB还是AOF,取决于具体的应用场景,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。