- 持久化是
Redis
一个重要的功能点,可以有效的避免服务器因为停电,断网等多种因素导致Redis崩溃后,及时恢复有效数据。 - Redsi分为俩种持久化策略,
RDB
与AOF
。 - 俩种持久化策略可单独配置,也可同时存在。
- 如果只配置
AOF
,重启时加载AOF
文件恢复数据; - 如果同时配置了
RDB
和AOF
,启动是只加载AOF
文件恢复数据; - 如果只配置
RDB
,启动是将加载dump
文件恢复数据。
- 如果只配置
RDB
RDB
,也被称为快照。它可以将某一时刻的所有数据都写入硬盘。比如快照在8点5分创建成功,8点10分创建下次快照,如果在10分的快照没有创建成功就崩溃,则丢失8点5分之后所有的数据。
如何生成RDB
默认配置
- 在Redis的配置文件Redis.conf有如下配置
//满足任何一个条件,自动建立快照
save 900 1 //900 秒(15 分钟)如果至少更改了 1 个密钥
save 300 10 //300 秒(5 分钟)后,如果至少更改了 10 个密钥
save 60 10000 //如果至少更改了 10000 个密钥,则 60 秒后
在该配置下创建的快照,调用的命令是BGSAVE
使用命令创建
- BGSAVE
- 会调用
fork
来创建一个子进程,然后子进程负责将快照写入磁盘,而父进程继续处理命令请求。 - 存在因为创建子进程而导致的进程问题和内存占用问题。
- 会调用
- SAVE
- 采用此命令的话,则redis在快照未创建完成前,不会接受其他命令,该命令并不常用,生产环境慎用,一般只有无法直接
BGSAVE
(比如服务器内存不够,无法支持创建子进程)或者等待快照创建完成也无妨才会使用。
- 采用此命令的话,则redis在快照未创建完成前,不会接受其他命令,该命令并不常用,生产环境慎用,一般只有无法直接
- SHUTDOWN
- 此命令是关闭服务器,如果执行此命令,会调用
SAVE
来创建快照。阻塞客户端,不再执行客户端发送的所有命令,在SAVE
执行完毕后,关闭服务器。
- 此命令是关闭服务器,如果执行此命令,会调用
主从复制
- 当一个
Redis
连接另外一个Redis
,并向对方发送SYNC
来开始一次复制操作,如果主服务器目前没有在执行BGSAVE
,或者主服务器并非刚刚执行完BGSAVE
,那么主服务器就会执行BGSAVE
。
RDB生成文件的位置及使用
-
查看
Redis
的redis.conf
配置文件dbfilename dump.rdb //dump.rdb可自由重命名 dir ./ //./可修改文件保存位置
-
使用只需要将
RDB
文件放到Redis
安装目录下,重新启动服务器即可。1.访问redis根目录 cd /user/local/redsi //redis的安装目录 2.登录redis:redis-cli -h 127.0.0.1 -p 6379 //也可以直接使用客户端来连接 3.查看所有key值:keys * //如果没有数据的话可以自己添加些 4.使用生成快照命令:SAVE //返回ok之后,把redis目录下的dump.rdb文件先复制到别处 5.清空整个 Redis 服务器的数据:flushall //执行完之后,发现redis中没有数据 6.还原数据,把dump.rdb再放回安装目录,redis服务器重启: 如果Redis已经配置为service服务,可以通过以下方式重启: service redis restart 如果Redis没有配置为service服务,可以通过以下方式重启: /usr/local/bin/redis-cli shutdown /usr/local/bin/redis-server /etc/redis.conf
注意事项
- 只是用
RDB
来进行持久化数据,如果Redis
崩溃,系统将会丢失最近一次快照生成之后的所有数据。
AOF
-
只追加文件,它会在执行写命令的时候,将被执行的写命令复制到硬盘里面。
Redis
只需要从头到尾执行一次AOF
所包含的所有写命令,就可以恢复AOF
文件所记录的数据集。 -
AOF默认是关闭的,可以通过redis.conf来打开。
appendonly no //yes为打开
-
如何使用同
RDB
一样,放到对应目录,然后重启服务。
同步频率
-
redis.conf
的appendfsync
来控制同步频率。# appendfsync always //每个redis都要执行写命令同步,严重降低redis的速度。 appendfsync everysec //每秒执行一次同步,显示的将多个写命令同步到磁盘 # appendfsync no //让操作系统来决定何时执行同步
always
都被写入磁盘,从而系统崩溃导致的数据丢失减少降到最少,但对硬盘大量吸入,降低redis
的速度,且硬盘是固态的话,还会降低硬盘寿命。everysec
使用的最多,即使发生崩溃,也最多丢失1秒的数据。no
无法把控,这会导致系统崩溃,丢失不定量的数据。
注意事项
-
AOF
文件随着Rdis
的不断运行,AOF
文件的体积也在不断增长,极端情况下可能会用完硬盘所有的可用空间,另外一方面,AOF
文件体积的不断增长,日后还原数据,执行文件的时间也就越长。-
BGREWRITEAOF
- 该命令会移除
AOF
文件中冗余的命令来重写AOF
文件,尽可能的降低其体积大小。 - 工作原理类似于
BGSAVE
,会fork
一个子进程,然后由子进程来对AOF
文件进行重写。 - 同样存在因为创建子进程而导致的进程问题和内存占用问题。
- 该命令会移除
-
Redis.conf相关配置
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
- 在启用
AOF
持久化的时候,如果AOF
文件的体积比上一次重写的体积大了100%并且大于了64MB,就会执行BGREWRITEAOF
命令。
- 在启用
-
-
可根据实际情况具体修改其参数,不过体积越大,还原时间越长。