redis的持久化使用

来自文章集合:一文带你搞懂redis使用过程(持续更新中)

redis如何使用持久化?

redis通过RDB和AOF来实现数据的持久化。RDB做镜像全量持久化,AOF做增量持久化。

什么是RDB?

RDB是一种快照持久化文件,它定期将redis数据的快照保存到磁盘的二进制文件中,这个快照包含redis某个时间点的完整状态,包括所有key、值和数据结构。RDB是一个紧凑的二进制文件,很适合用来进行数据备份和恢复。

RDB优缺点

优点:

  • 高性能,RDB需要定期进行备份,不需要每次写操作进行磁盘写入
  • 适用于灾难恢复:RDB文件对灾难恢复十分有用,因为他可以快速恢复到某个时间点的完整状态

缺点:

  • 可能会造成数据丢失;RDB是周期性进行备份更新,如果redis在生成快照(备份)之间崩溃,会丢失最后一次快照之后的所有写操作
  • 不适合实时备份;RDB生成快照的期间,会导致redis某个瞬间性能下降、阻塞
  • 不具有可读性;RDB生成二进制文件,不容易查看和分析

RDB使用

redis文件夹面有一个redis.windows.conf文件,在里面可搜索到下面相关配置,根据自身需求,可进行rdb配置的修改。

bash 复制代码
#   启动rdb持久化
save 900 1  # 900秒内,如果至少有一个键被修改,则执行快照
save 300 10 # 在300秒内,如果至少有10个键被修改,则执行快照
save 60 10000   # 在60秒内,如果至少有10000个键被修改,则执行快照

什么是AOF?

AOF是一种追加日志方式的持久化文件,每次写操作都会追加aof文件的末尾,以记录操作的顺序和详细信息。当redis重启时,会重新执行aof文件中的写操作,来恢复redis数据

AOF的优缺点

优点:

  • 数据安全:aof持久化 记录 每次写操作的顺序和详细信息,减少数据丢失的风险
  • 实时备份:aof持久化可以每次写操作都记录操作,这意味着数据可以近乎于实时的存到磁盘,适用于实时备份
  • 可读性:AOF文件 是一个文本文件,容易查看和分析

缺点:

  • 性能问题,aof持久化需要记录每一个写操作,在高写入负债下,性能回下降
  • 文件体积:AOF文件一般比RDB文件大,因为AOF持久化文件包含每个写操作的详细信息
  • 恢复时间:AOF文件在恢复时可能比RDB操作要慢,因为它需要执行每一个写操作

AOF的使用

redis文件夹面有一个redis.windows.conf文件,在里面可搜索到下面相关配置,根据自身需求,可进行aof配置的修改。

bash 复制代码
appendonly yes  #  开启AOF,默认为关闭
appendfilename "appendonly.aof"	# 指定aof文件的名称

#	下面aof记录写操作的频率三个设置

#   默认,每次写操作都进行磁盘写入,高写入频率会影响性能,因为是同步操作
appendfsync always	

#   每秒将累计的写操作进行磁盘写入
appendfsync everysec

#   不执行显式的同步操作。而是依赖操作系统来决定何时将数据刷写到AOF文件。这是性能最高的选项,因为Redis不需要等待同步操作完成。但也是最不安全的选项,因为操作系统可能在Redis认为数据已经持久化时丢失数据。
appendfsync no


#	配置AOF重写
auto-aof-rewrite-percentage 100 #   设置aof文件大小达到原始aof文件大小的100%触发重写
auto-aof-rewrite-min-size 64mb  #设置最小的aof文件大小为64mb

总结

因为RDB数据备份之间会消耗较长时间,不够实时,在停机的时候可能会导致大量数据丢失,所以需要AOF来配置使用。在redis重启时,会使用RDB文件重新构建内存,将redis恢复到最近时间点的状态,在使用AOF文件重新执行写操作来将数据恢复到服务器停机前的状态。

引申

如果机器突然断电会怎么样?

这种情况下取决于AOF的sync设置,如果是always,每次写操作都会执行磁盘写入,那么就不会丢失数据,如果设置eveysec,1秒同步一次,那么最高只会丢失一秒数据。


RDB的原理是什么,是如何备份的?

Redis在生成RDB文件时会使用类似于UNIX的fork系统调用来创建一个子进程。这个子进程是父进程的复制,包括内存中的数据。因此,在生成RDB文件之前,子进程和父进程的数据是一致的 子进程使用copy on write(写时复制的技术:子进程开始RDB生成过程中,会创建内存的副本,并在副本上执行操作)进行数据写入,父进程继续为客户端提供读写服务。

相关推荐
测试界柠檬3 分钟前
面试真题 | web自动化关闭浏览器,quit()和close()的区别
前端·自动化测试·软件测试·功能测试·程序人生·面试·自动化
hai405876 分钟前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构
陈大爷(有低保)25 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
Redstone Monstrosity38 分钟前
字节二面
前端·面试
kinlon.liu39 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Adolf_19931 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask