由于存储在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持久化译文 )