由于存储在Redis的数据都是存在内存中,所以重启Redis或者服务器,数据都会丢失。

但是Redis也提供了持久化功能。主要通过两种方式实现

1.RDB方式

RDB方式的持久化是通过快照完成的。当符合一定条件的时候,Redis会自动将内存中的所有数据生成一份副本并存储到硬盘上。这个过程就是快照。在下面几种情况会对数据进行快照。

1. 根据配置的规则进行自动快照
2. 用户执行save或bgsave命令
3. 执行flushall命令
4. 执行复制(replication)

1.1 根据配置规则进行自动快照

进行快照的条件可以在配置条件中自定义,由两个参数构成,时间M(秒)和改动键的个数N,每当时间M内被更改的键的个数大于N时,即符合自动快照条件,进行自动快照。

示例:

save 900 1 #900秒内1个或1个以上键被改自动快照

save 300 10 #300秒内10个或10个以上键被改自动快照

1.2 save或bgsave命令

当我们需要重启Redis或者服务器的时候,手动进行快照,通过Redis提供的命令,save/bgsave

1.2.1 save

执行save的时候,Redis同步的进行快照,在执行的时候会阻塞所有客户端请求,当数据库比较多的时候,会执行比较长的时间,所以生产环境尽量避免食用。

1.2.1 bgsave

手动快照推荐使用bgsave,与save不同,bgsave可以在后台异步的进行快照操作,在快照的同时,继续响应客户端请求。执行bgsave会立即返回ok表示开始执行操作,如果想知道快照是否完成,可以通过命令lastsave查看最近一次执行快照的时间。

1.3 执行flushall

执行flushall命令,Redis会清除数据库中所有的数据,不论清空的时候,是否触发快照条件,都会进行快照。例如,设置了save 1 1000,数据库只有一个键,也会进行快照,但是如果没有设置快照条件,不会进行快照。

1.4 执行复制时

当设置了主从模式时,Redis会在复制初始化时进行自动快照,没有定义自动快照条件,也没有手动执行快照操作,也会进行快照。

另外还有几个配置

stop-writes-on-bgsave-error yes  # 后台备份进程出错时,主进程停不停止写入
rdbcompression yes  #导出的rdb文件是否压缩
rdbchecksum yes  # 导入rdb恢复数据是否执行完整性验证
dbfilename dump.rdb # 导出的文件名
dir /usr/local/var/db/redis/  #导出数据存储目录

如果需要关闭rdb方式

#save 900 1    
#save 300 10   
#save 60 10000

全部注释则关闭rdb方式

2.AOF方式

当Redis存储非临时数据的时候,一般需要打开AOF持久化降低进程中止导致的数据丢失,AOF将Redis执行的每一条命令追加到硬盘文件中,这会降低Redis的性能,但是基本还可以接受,使用较快的硬盘可以提高AOF的性能。

2.1 开启AOF

修改配置文件(redis.conf)中的参数:

appendonly  yes  # 默认为no

开启了,之后每条写命令都会写入硬盘中的AOF文件,默认文件名为appendonly.aof,可通过配置文件修改

appendfilename appendonly.aof

例如我们执行了几条命令:

set name vilay
set name vilays
set name vilay

AOF会把三条命令都写入aof文件,但是前两条会被覆盖,记录也意义不大,Redis也确实是这样实现的,达到一定条件就自动重写aof文件.

我们可以修改条件来更适应我们的需求

auto-aof-rewrite-percentage 100  #当aof的文件超过上次重写时aof文件大小的百分之多少,进行重写
auto-aof-rewrite-min-size 64mb #限制了允许重写的最小aof文件大小

除了自动重写,我们还可以手动执行命令,BGREWRITEAOF,执行重写.

2.2 同步硬盘数据

开启了AOF之后,命令并不是实时的记录到硬盘的,都是优先进入系统硬盘缓存,Redis默认情况下每隔30秒,执行一次同步操作,把系统硬盘缓存中的数据同步到硬盘.如果在这30秒中,发生了系统异常,则会导致数据丢失.所以如果担心数据丢失,我们需要修改Redis配置,通过修改参数设置同步的时机:

# appendfsync always  #每次执行就同步(最安全,但是最慢)
appendfsync everysec  #每秒同步 (系统默认,一般使用这个就够了)
# appendfsync no #不主动进行同步

此外还有几个配置

no-appendfsync-on-rewrite  yes  #正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb  #aof文件,至少超过64M时,重写

两种方式都可以达到持久化的结果,可以用一种也可以结合起来使用。

如果两种方式都有,优先使用aof进行数据恢复同步。

dump rdb过程中,aof如果停止同步,数据也不会丢失,所有的操作缓存在内存的队列里, dump完成后,统一操作.

在数据恢复过程中,rdb速度比aof快。

Redis 持久化有一篇文章很不错,推荐下 Redis持久化译文 )