redis的持久化

由于redis的数据是存储到内存中的,如果服务器一旦断电,内存中的数据将会丢失,为了保证redis中的数据不会丢失,redis提供了持久化技术

也就是将数据保存到文件中。appendonly.aof  dump.rdb

redis的持久化有两种方式,一种是RDB,还有AOF

RDB原理

在默认情况下,redis将内存数据库快照保存在名为 dump.rdb 的二进制文件中。由于是二进制文件,所以这个文件相对(AOF)来说比较小

你可以对redis进行设置,让它在 "N秒内数据集至少有M个改动" 这一条件被满足时,自动保存一次数据集

 比如说,一分钟内有1000个健被改动过,那么满足这一条件时候,会进行rdb持久化

想要关闭rdb持久化策略,那么在redis.conf 配置文件中注释 save 保存策略注释即可,save保存策略可以配置多个

 

还可以手动执行命令生成rdb快照,进入redis客户端执行命令save或者bgsave可以生成dump.rdb文件,每次命令执行都会将所有redis内存快照到一个新的

dump文件里,并且覆盖原有的dump文件内容。

bgsave和save的异同点

命令 save bgsave
io类型 同步 异步
是否阻塞redis其他命令
优点 不会消耗额外内存 不阻塞客户端命令
缺点 阻塞客户端命令 需要fork子进程,消耗内存
     

 

 

默认生成的rdb文件后台使用的是bgsave方式

AOF持久化

RDB持久化有他的缺点,如果因为redis宕机,那么redis将丢失最近写入、且没有保存到快照中的那些数据。为了解决这个痛点,redis引入了一个新的持久化方式,AOF持久化

将修改的每一条redis指令记录进文件appendonly.aof中。由于记录了很多个Redis命令,所以相对来说比较大

也就是这个文件用来记录你的什么set hset zadd 等修改命令

但是如果你设置了key的过期时间,aof文件并不会记录你的原始过期命令,而是记录key过期的时间戳

在redis.conf文件中可以打开aof配置,appendonly yes

这样的话,当redis重启时就可以读取aof文件恢复数据。那么多久同步一遍redis操作key的命令呢?有三个选项

1.appendfsync always: 每次有新命令追加到AOF文件时就执行一次fsync,非常慢也非常安全

2.appendfsync everysec:每秒同步一次,足够快,并且在故障时只会丢失一秒数据。

3.appendfsync no: 从不 fsync 将数据交给操作系统来处理。更快,也更不安全的选择

推荐也是默认的选择,每秒同步一次。

 

AOF重写

aof文件里可能有太多没用的指令,比如某个key已经被删除了或者过期了,但是仍然保存当时创建这个key的命令,那么就会浪费空间。

所以aof会定期根据内存的最新数据生成aof文件。

在redis.conf文件中,如下两个配置可以控制aof重写频率

auto-aof-rewrite-min-size 64mb .aof文件至少要达到64mb才会自动重写,文件太小恢复速度本来就很快,重写的意义不大

auto-aof-rewrite-percentage 100 aof文件自上一次重写后文件大小增长了100%则再次触发重写

当然aof还可以手动重写,执行bgrewriteaof重写aof

aof重写会fork一个子进程去做,类似于bgsave,不会对redis读写命令处理有影响

 

aof和rdb选择哪一个?

建议都启用了,redis启动时候如果既有rdb又有aof,那么redis恢复数据优先选择aof。因为aof一般来说数据更安全。

 

混合持久化

在redis.conf文件中开启混合持久化,必须先开启aof

aof-use-rdb-preamble yes

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转化为redis命令写入aof文件中,而是将重写这一刻之前的内存做RDB快照处理,并且将rdb快照内容和增量

的aof修改内存数据命令存在一起,都写入新的aof文件,新的文件一开始不叫appendonly.aof,等到重写完新的aof文件才会进行改名,覆盖原有的aof文件,完成新旧两个

aof文件的替换。

于是在Redis重启的时候,可以先加载rdb的内容,然后再重放增量的aof日志文件就可以完全替代之前的aof全量文件重放,因此重启效率大幅度得到提升。

redis的混合持久化真的是惊为天人的设计,既保证了速度又保证了数据的安全性,牛逼

 

Redis数据备份策略

1.先shell定时调度脚本,每小时或者半小时复制一份rdb或者aof文件。

2.每天都保留一份当日的数据备份到一个目录中去,可以保留最近一个月的备份

3.每次copy的时候,都可以把太旧的备份删了

4.每天晚上将当前机器上备份复制一份到其他机器上,以防机器损坏

 

posted @   诸葛匹夫  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示