前言
Redis是一种基于内存,通过key-value结构来实现的高性能nosql关系型数据库。它与memcached类似,不过Redis支持数据的持久化,而且支持的数据类型非常的丰富,如:string(字符串),list(列表),set(集合),sorted set(有序集合),hash(哈希)。除了支持丰富的数据类型之外,还能够在服务器端计算集合之间的交集,并集,补集等,还支持各种排序功能。所以说Redis也可以看做是一种数据结构服务器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。那么这两种持久化方式有什么区别呢,该如何选择呢?
Redis提供了两种方式的持久化机制:
①RDB持久化机制(Redis Database):是一种基于内存快照的持久化方式。将Redis在内存中的数据,在指定的时间间隔内将内存中的数据集快照写入磁盘
②AOF持久化机制(Append Only File):是redis使用日志的方式来持久化数据的一种方式。将操作日志aof文件通过追加的方式写入文件
RDB和AOF的区别
RDB持久化,是指在符合一定的条件下,将内存中的 数据集 以 快照 的方式写入磁盘,实际操作过程是fork一个子进程,先将数据写入临时文件,写入成功后,再替换之前的文件,用二进制压缩储存。
Redis会在以下几种情况下对数据进行快照:①根据redis.conf中配置规则进行自动快照(配置规则见文末) ②用户执行save或者bgsave命令 ③执行flushall命令(清库操作) ④执行主从复制操作时
AOF持久化,是以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的形式记录,可以打开文件查看到详细的操作记录。
RDB和AOF的优缺点
RDB的优点:
①一旦采用该方式,那么你的整个Reids数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近24小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。【适合大规模的数据恢复】
②相对于AOF存储的是日志,RDB更节省磁盘空间【节省磁盘空间】
③性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。
④相比于AOF机制,如果数据集很大,RDB机制的启动效率会更高。【恢复速度快】
RDB的缺点:
①会导致数据丢失。如果你想保证数据的高可用性,即最大限度的避免数据丢失。RDB机制不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将消失。
②由于RDB机制采用fork子进程来完成数据的持久化工作,所以,当数据集足够大时,可能会导致服务器停止几百毫秒,乃至于一秒钟都是有可能的。
参考:Redis持久化之大数据服务暂停问题_扛麻袋的少年的博客-CSDN博客
AOF的优点:
①该机制可以带来更高的安全性,即数据持久性。AOF提供了3种同步策略。即1、每秒同步 2、每次修改同步 3、不同步。
1.每秒同步:其本质也是异步操作。只是每秒钟强制写入磁盘一次,看着是效率也比较慢,但是官方已经在性能和持久化方向中做了很好的折中,推荐使用!!!
2.每次修改同步:我们可以视为它是同步持久化,即每次发生数据变化都会立即flush到磁盘,这种是效率最慢的,但是能够保证完整的持久化,不推荐使用!!!
3.不同步:性能最好,完全依赖OS,就是没有持久化操作,不推荐使用!!!
②由于AOF机制对日志文件的写入操作采用的是append模式,因此在写入过程中,即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过 redis-check-aof 工具 来帮助我们解决数据一致性的问题
③如果日志文件过大,Redis可以自动启用 rewrite 机制。即 Redis 以 append 模式不断的将修改数据写入到老的磁盘文件中。同时Redis会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行 rewrite 切换时可以更好的保证数据的安全性。
④AOF机制包含一个格式清晰、易于理解的日志文件,用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的恢复。
AOF的缺点:
①对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB在恢复大数据集的速度比AOF的恢复速度要快。
②根据同步策略的不同,AOF机制在运行效率上往往会慢于RDB机制。每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。
RDB和AOF如何选择?
就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(AOF),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save(线上慎重使用save)或者bgsave的时候,再做备份(RDB)。我们可以通过命令:config get save
Redis默认使用的是 RDB。持久化规则为:
3600 1 #在3600秒(60分钟)之后,如果至少有1个key发生变化,则dump内存快照。
300 100 #在300秒(5分钟)之后,如果至少有100个key发生变化,则dump内存快照。
60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
我们可以通过命令:config get save 来查看默认的持久化方案。也可以通过 config get * 来查看所有的配置类相关信息。
如果要关闭RDB,
①执行 config set save "" 即可。
②或者进入配置文件将:
Save 900 1
Save 300 10
Save 60 10000
注释掉,并打开save "" 的注释,使得 save "" 生效,即可关闭RDB
RDB和AOF在配置文件中如何配置
RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开redis.conf文件之后,我们搜索save,可以看到下面的配置信息:(三个配置之间是"或"的关系)
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
AOF持久化配置(默认是关闭状态,修改redis.conf文件中appendonly为yes即可打开。如果rdb和aof同时打开,会优先使用AOF)
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的默认策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
Redis 禁用持久化
Redis是默认开启RDB的,AOF则是默认关闭的,相当于初始安装的Redis是持久化的。
如何关闭 Redis 持久化?我的需求是只把redis当作缓存来用,所以持久化到硬盘对我的需求来说没有意义。
修改redis配置文件,redis.conf 第115行左右。
#1.注释掉原来的持久化规则
save 900 1
save 300 10
save 60 10000 # 将这三行注释掉
#2.设置为空
save ""
#3.删除已持久化生成的dump.rdb文件(没有请忽略,如果使用中途要禁用持久化rdb,则需要删除dump.rdb文件)
#4.重启redis服务即可。
AOF和RDB同时开启,Redis听谁的
AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
博主写作不易,来个关注呗
求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙
博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ