面试官:什么是Redis持久化—>RDB持久化

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍


Redis 持久化主要解决数据丢失问题,在Redis中有两种持久化方式:

  • RDB 持久化【本篇主要内容】
  • AOF 持久化

RDB概述

RDB 全称Redis Database Backup file (Redis 数据备份文件),也叫做Redis 数据快照。简单来说就是内存中的所有数据都记录到磁盘中。当 Redis 实例故障重启后,从磁盘读取快照文件,恢复数据。(快照文件称为RDB文件,默认是保存在当前运行目录下)
那么 RDB 方式该如何使用?

# 第一种方式【不推荐】
127.0.0.1:6379> save # 由 Redis 主进程来执行RDB,会阻塞所有命令 ,但是当数据量过大时,会导致耗时
# 第二种方式【推荐】
127.0.0.1:6379> bgsave #子进程执行RDB,避免主进程受到影响

另外,Redis 默认有持久化,但是这个持久化只有在停机时才执行,以下案例可以验证默认持久化问题,具体步骤如下:

  1. 开启 redis server

    redis-server /usr/local/etc/redis.conf
    
  2. Redis 客户端建立连接

    ➜  ~ redis-cli
    127.0.0.1:6379> set age 100
    OK 
    
  3. Ctrl+C关闭 redis server,则会在命令行出现以下内容
    在这里插入图片描述
    在当前目录下,会生成一个dunp.rdb文件,当再次开启服务时,数据会恢复

  4. 开启服务 redis-server ,然后客户端重新建立连接

    ➜  ~ redis-cli
    127.0.0.1:6379> get age
    "100"
    

以上为RDB快照方式,但是有一个问题

问题在停机时执行 RDB 快照,但是如果想要每隔一段时间进行数据保存,应该怎么做呢?

解决方式:修改配置文件,具体如下:

打开 redis.conf 文件,在MAC中配置文件的路径如下:/usr/local/etc/redis.conf 会看到在配置文件中有 snapshotting(快照)相关的配置。
在这里插入图片描述
其中,

save 3600 1
save 300 100
save 60 10000
# 含义:3600s内,如果至少有一个key被修改,则执行bgsave,
save "" 表示禁用RDB
#RDB的其他配置也可以在redis.conf文件中设置,例如:
/usr/local/var/db/redis

在这里插入图片描述

rdbcompression yes
dbfilename dump.rdb
dir /usr/local/var/db/redis/

如果使用的是 redis-server /usr/local/etc/redis.conf开启服务,则RDB快照文件在
dir /usr/local/var/db/redis/目录下。

如何实现异步持久化?
bgsave 开始时会 fork 主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。
那么 fork底层到底是怎么实现的呢?
主进程要实现对 redis 数据的读写,要在内存中操作,在linux系统中所有的进程都没有办法直接操作物理内存,而是由操作系统给每个进程分配一个虚拟内存,所以主进程只能操作虚拟内存,而后操作系统会维护一个虚拟内存与物理内存间的映射关系表,这个表就是常说的“页表”。所以主进程操作虚拟内存,虚拟内存基于页表的关系找到物理内存中数据的位置,从未实现了主进程操作物理内存。
在这里插入图片描述
执行 fork 的时候会创建一个子进程,fork的过程就是拷贝页表,将页表拷贝给子进程,所以子进程可以根据页表的映射关系,进而操作物理内存。也实现了主进程与子进程的空间共享,这样加快了读写速度。子进程读取数据后再写入新的 RDB 文件,替换旧的RDB文件(这块存在磁盘)。
在这里插入图片描述
当时此处有一个问题,主进程在写的同时,子进程在读,可能会出现冲突,或者一些脏数据,为了避免这种问题呢,fork底层采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存
  • 当主进程执行写操作时,会拷贝一份数据,执行写数据。

总结

RDB方式 bgsave 的基本流程?

  • fork主进程得到一个子进程,共享内存空间
  • 子进程读取内存数据并写入新的RDB文件
  • 用新RDB文件替换旧的RDB文件

RDB 会在什么时候执行,save 60 1000代表是什么含义?

  • 默认是服务停止时。
  • 代表60秒内至少执行1000次修改则触发 RDB

RDB的缺点?

  • RDB 执行间隔时间长,两次RDB 之间写入数据有丢失的风险。
  • fork子进程,压缩、写出RDB文件都比较耗时。
  • 35
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小曾同学.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值