目录
1.Redis的持久化:
2.Redis中持久化方式:
2.1 快照持久化
2.2 AOF持久化
2.3 快照持久化和AOF持久化的差别:
2.4手动发起快照持久化:
3.如何设置两种持久化方式的相关信息?
4.查看并分析dump.rdb和appendonly.aof文件内容:
5.总结:
Redis具有持久化功能,其支持边运行边将内存中的数据备份到硬盘中,这样子的好处就在于:当Redis运行时服务器突然断电可以减少数据丢失的损失。而这个过程就称之为“持久化”过程。
默认开启。一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(例如高达10G),则此过程较慢,不适合频繁执行该持久化操作。因为它每次都是全部数据
由于快照持久化每次保存的都是全部的数据,所以它的保存时间就不能设置那么频繁,否则会导致CPU和存储等硬件资源的消耗太大。而又为了达到数据的安全性,于是就有了AOF持久化。如下图场景:
因为快照持久化设置的频率过短会给CPU等硬件造成压力。所以快照持久化不可以过于频繁。例如上图,这又会导致一个数据安全性降低的问题。AOF就是用来解决这个问题的。还是上一场景中:
在这个场景中,也就是在快照持久化的间隙中加入了AOF持久化(即精细持久化)。
快照持久化每次向磁盘中保存的都是全部的数据,而AOF持久化是将用户操作Redis时修改的每一个key的语句都保存起来,还原数据库的时候直接把语句执行一遍即可(也可以理解成快照持久化保存的是数据,而AOF持久化保存的是执行语句),它的频率可以达到秒。
#redis登录方式 + bgsave
.redis-cli -h 127.0.0.1 -p 6379 -a 13456 bgsave
持久化方式的相关信息的修改都是在Redis中总的配置文件redis.conf中进行的。redis.conf文件在redis的安装目录下。例如我的redis安装在了/opt下,那么我在/opt下打开redis安装的那个目录后即可看到redis.conf:
使用以下命令打开此文件:
vim redis.conf
如果所安装的linux系统没有vim(vi的升级版)这个命令可以选择使用vi或者通过yum进行下载vim。redis.conf中大致内容(这里面关于Redis的配置信息有很多,我只把这篇博客中用到的信息复制粘贴过来):
用于配置快照持久化的频率:
save 900 1 #每900s若超过1K数据被修改,便发起一次快照保存
save 300 10 #每300s若超过10K数据被修改,便发起一次快照保存
save 60 10000
保存快照持久化信息的文件:
# The filename where to dump the DB
#这个是用于快照持久化保存其信息的文件 即dump.rdb
dbfilename dump.rdb
数据库存放目录:
#用于指明本地数据库存放目录如:dump.rdb的存放目录
#默认"./" 建议手动设置
# The working directory.
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /usr/local/redis/
例如我执行 cd /usr/local/redis之后观察此目录下的信息,可见快照持久化信息文件dump.rdb和AOF持久化信息文件appendonly.aof全在这里进行保存:
关于AOF持久化的设置:
#手动开启AOF持久化方式 默认是no
appendonly yes
# The name of the append only file (default: "appendonly.aof")
#AOF持久化信息保存在appendonly.aof中
#此文件保存在使用dir 配置的数据库信息的存放目录下
#例如我这里是:/usr/local/redis/
appendfilename "appendonly.aof"
配置文件更改之后需要将之前的Redis进程杀掉,然后重启Redis才可以使用。且AOF开启之后,之前Redis中存储的信息将会清空。
#ps -A 查找所有进程
# | 将ps -A 查找出的信息交给grep命令
# grep redis 在所有进程中搜索出redis
ps -A | grep redis
#强制性关闭进程号为1746的进程
kill -9 1746
使用redis-server + redis.conf配置文件路径的方式启动redis(redis启动的方式之一 即通过redis-server制定配置文件启动):
设置AOF持久化频率:
# appendfsync always 每次写指令都写入磁盘,即完全保证持久化(对性能影响大)
#每一秒执行一次 性能与持久化进行折中(建议使用)
appendfsync everysec
# appendfsync no 完全依赖于OS系统的此时资源占有 (持久化无法完全保证,但是性能高)
首先在redis中保存相应部分数据:
查看appendonly.aof文件内容:
可见:appendonly.aof中保存的是每次在Redis中执行的指令。
对appendonly.aof中的备份做优化处理:
现在我把Redis中存储的age这个key执行三次自增:
使用vim打开appendonly.aof观察其内容:
可以发现incr每执行一次都被记录在了appendonly.aof文件中,这样子是比较浪费空间的。我们可以对其进行优化处理:
./redis-cli -h 127.0.0.1 -p 6379 -a 123456 bgrewriteaof
即使用登录命令+bgrewriteaof对aof文件进行压缩。观察压缩之后的aof文件内容并与之前的进行对比:
可见aof文件中的多个incr变成了一个set age 22。
查看dump.rdb中的内容:
在这里因为执行的指令较少,还看不出其特点。牢牢记住:dump.rdb是持久化的内存中的所有数据。
快照持久化和AOF持久化是一个互补的关系。快照持久化来做打的备份,AOF持久化来做细则备份。数据还原的时候要把快照持久化文件dump.rdb和AOF持久化文件appendonly.aof一并拿出来用于做数据的还原。如果将A服务器的这两个文件拷贝到B服务器中的Redis的数据库存放目录中,那么当B这台服务器启动之后,这两个文件就会被加载。于是,在B服务器上就可以看到A服务器上Redis数据库中的数据内容。因为当B服务器的Redis启动的时候,会从硬盘中读取dump.rdb和appendonly.aof中的数据,然后将其放入内存中。