Redis 持久化

简介

Redis是一个支持持久化的内存数据库,可以将内存中的数据同步到磁盘保证持久化。我们知道Redis会将数据缓存在内存中,如果没有持久化,在服务器关闭或重启之后数据会丢失。为了保证数据的安全以及效率,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。而Redis提供了RDB和AOF两种持久化策略。

一、RDB

Redis默认是会以快照RDB的形式将数据持久化到磁盘的一个dump.rdb二进 制文件。当Redis决定要持久化时,会 fork 一个子进程将数据写到磁盘上一个临时的RDB文件中,当子进程完成写操作后,将原来的RDB替换掉。而Redis会在满足某些条件后会进行持久化,并且可以对其进行配置。

1、配置RDB

在redis.conf文件中找到"Save the DB on disk"的配置,我们可以根据需要来修改这Redis的RDB持久化策略。

说明:

save 900 1(如果在900秒之内有1次操作,则执行快照保存)

save 300 10(如果在300秒内有10次操作,则执行快照保存)

save 60 10000(如果在1分钟之内有10000个次操作,则执行快照保存)

2、SAVE和BGSAVE

我们可以在客户端直接使用SAVE或者BGSAVE命令立即将Redis的数据持久化到RDB文件中。他们两者的区别在于BGSAVE命令会fork一个子进程在后台进行持久化,主进程可以继续处理客户端发送的命令(非阻塞)。而SAVE命令需要等待Redis持久化完成后才可以继续处理客户端发送的命令(阻塞)。

1)RDB优点

RDB非常适合用于数据备份, 可以在当天内每小时备份一次,或者每个月的每天都进行备份。 如果遇到断电或者宕机等其他一些灾难情况,可以随时将数据集还原。

2)RDB缺点

如果对数据的完整性和安全性要求非常高,要求每一次的操作数据都能持久化到文件中,这时RDB就不太适合了。因为RDB是按照时间范围的操作次数为条件促发持久化,如果未满足这些触发条件,Redis并不会将数据保存到文件,导致数据丢失。例如:save 60 10000,如果在1分钟之内有9000次的操作,如果此时服务器异常退出或宕机,由于未满足条件,将导致丢失这1分钟的数据。

3、AOF

AOF持久化可以记录每个写操作,将Redis执行过的所有写指令(读操作不记录)保存到appendonly.aof文件中,并且只允许追加文件而不可以改写文件。在Redis启动的时候会读取该文件重新构建缓存数据。在打开AOF持久化机制之后,Redis每当接收到一条写命令,会先写入系统缓存,然后每隔一定时间(默认是每秒钟)fsync一次(写入到指定文件)。

1)启用AOF

AOF持久化默认是关闭的,如果要启用AOF,需要在redis.conf配置文件中启用该功能,将appendonly no设置为appendonly yes。

所有写操作默认保存在appendonly.aof文件中,可以自行修改保存的路径和文件名。

2)同步策略

AOF提供了三种同步策略:

  • always(每次写操作就执行一次fsync)

  • everysec(每秒执行一次fsync,默认)

  • no(不执行fsync)

4、AOF重写

AOF会记录Redis所有的写操作命令,但这种方式会造成一个问题,就是随着时间的推移,大量频繁的操作将导致AOF文件体积的急剧增长,对系统会造成影响。为了解决以上的问题, Redis就需要对AOF文件进行重写。重写的过程会创建一个新的AOF文件来代替原有的AOF文件, 而新AOF文件和原有AOF 文件保存的数据状态是一致的,但新文件的体积将变得尽可能地小。以下两种方式会触发AOF重写。

1)手动出发

在客户端直接向Redis发送BGREWRITEAOF命令,这个命令会通过移除AOF文件中的冗余命令来重写(rewrite)AOF文件。

2)自动触发

其实在启用了AOF之后(appendonly yes),Redis会依据redis.conf配置文件中的auto-aof-rewrite-percentage选项和auto-aof-rewrite-min-size选项来自动执行BGREWRITEAOF命令。

说明:

例如设置了auto-aof-rewrite-percentage为100和auto-aof-rewrite-min-size为64mb,那么当AOF文件的体积大于64MB时,并且AOF文件的体积比上一次重写之后的体积大一倍(100%)的,Redis将执行BGREWRITEAOF命令进行重写。

AOF优点

AOF弥补了RDB按照时间范围的操作次数为条件的缺点,即使在默认的策略中发生故障,最多也只会丢失一秒钟的数据,更大程度的保证了数据的安全性。

AOF缺点

AOF会保存每一次的写操作,这将导致AOF文件的体积通常要大于RDB文件。如果选用always策略,则表示每一次操作都会记录到AOF文件中,从性能的角度上来说会低于RDB。当然,使用默认的everysec策略进行持久化性能还是非常可观的。

二、混合持久化

在实际应用中,通常会同时使用RDB和AOF两种持久化来找到一个最佳的平衡点,即能保证性能的同时最大程度保证数据的安全。因此需要RDB和AOF两者同时进行合理的设置和调整。而从Redis 4.0开始,官方提供了一种更加方便的混合持久化配置。

1、未启用混合持久化

在未启用混合持久化之前,如果我们往Redis写入一条记时,RDB文件会保存操作的键值数据,AOF文件则保存的是写操作的指令,我们可以分别查看一下这两个文件的内容。

使用cat命令查看RDB文件

然而显示的内容并不太直观也不易理解,因此可以借助Redis提供的redis-check-rdb工具进行查看。

RDB文件中会保存Redis的相关信息以及存储的keys数量和相关的活期时间。接下来我们继续查看AOF文件的内容,直接使用cat命名进行查看。

结果显示AOF文件中保存的是相关的操作指令。

2、混合持久化

要使用混合持久化,除了在redis.conf文件中启用AOF(将appendonly设置为yes),还需要将aof-use-rdb-preamble设置为yes。

设置完重新启用Redis服务。启用了混合持久化之后,使用BGREWRITEAOF命令执行一次AOF重写,同时向Redis插入一条新的数据。

然后再次使用cat命令再次查看AOF文件,这时会发现启用混合持久化之后的AOF文件内容和未启用时的AOF文件内容不一样。这是因为此时产生的AOF文件是一个RDB-AOF的混合文件,Redis会基于某种协议将此文件的前半部分存储RDB的数据,后半部分存储的是AOF的操作命令。

三、总结

Redis提供了两种持久化机制:RDB(Redis DataBase)和AOF(Append Only File)。

  1. RDB持久化:RDB持久化是将Redis的数据集以二进制形式保存到硬盘上。它可以通过配置定期自动执行快照,或手动执行SAVE和BGSAVE命令来进行数据持久化。RDB持久化的优点是快速、紧凑,适合用于备份和灾难恢复。但它的缺点是在发生故障时可能会丢失一部分数据。

  2. AOF持久化:AOF持久化是将Redis的操作日志以追加的方式保存到硬盘上。每当有写操作时,Redis会将该操作追加到AOF文件的末尾。它可以通过配置定期刷新文件、自动重写AOF文件,或手动执行BGREWRITEAOF命令来进行数据持久化。AOF持久化的优点是可以实现更高的数据安全性,因为它记录了每个写操作,可以保证数据不会丢失。但它的缺点是AOF文件相对于RDB文件会更大,恢复数据的速度可能较慢。

可以根据需求选择使用RDB、AOF持久化机制,或同时使用两者。通常情况下,可以同时启用AOF和RDB持久化,以提供更好的数据安全性和灾难恢复能力。在配置文件中,你可以通过设置save参数来定期执行RDB持久化,通过设置appendonly参数来启用AOF持久化。

需要注意的是,持久化机制会对Redis的性能产生一定影响,因为它需要将数据写入硬盘。可以根据实际情况和需求,权衡数据安全性和性能开销,选择合适的持久化方式。

相关推荐
小码的头发丝、21 分钟前
Django中ListView 和 DetailView类的区别
数据库·python·django
Karoku06631 分钟前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
材料苦逼不会梦到计算机白富美36 分钟前
golang分布式缓存项目 Day 1
分布式·缓存·golang
gorgor在码农1 小时前
Redis 热key总结
java·redis·热key
想进大厂的小王1 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情1 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
周全全1 小时前
MySQL报错解决:The user specified as a definer (‘root‘@‘%‘) does not exist
android·数据库·mysql
白云如幻1 小时前
MySQL的分组函数
数据库·mysql
荒川之神1 小时前
ORACLE 闪回技术简介
数据库·oracle
HBryce242 小时前
缓存-基础概念
java·缓存