给我说说Redis持久化机制RDB吧

news2024/9/29 23:28:07

基础

了解过Redis持久化RDB嘛?可不可以解释一下什么是RDB。

答: RDB持久化机制是将内存中的数据生成快照并持久化到磁盘的过程,RDB可以通过手动或者自动的方式实现持久化。

那RDB触发的方式有哪几种方式知道吗?

答: 有两种,分别是手动触发和自动触发:

手动触发

首先是save命令了,这个指令会直接阻塞当前redis服务器,知道RDB完成了为止,对于线上生产环境数据的备份,我们非常非常不建议使用这种方式。

127.0.0.1:6379> save
OK

接下来就是bgsave指令了,bgsave则是主进程fork一个子进程,由子进程完成持久化操作,而主进程继续处理客户端的读写请求,如果我们需要手动实现持久化,非常推荐使用这种方式。

# 从输出我们就可以看出这种方式会将持久化的操作放在后台执行
127.0.0.1:6379> bgsave
Background saving started

接下来就是自动触发了

自动触发我们可以通过配置实现redis.confsave参数实现,如下所示,假如我们希望用户20s内写入3次就进行持久化,只需在配置中加一条save 20 3即可。

save 20 3

需要注意的是save 20 3的20s是以redis的时间间隔为主,并不是用户第1次写入后的20s内再写入两次进行持久化。

在这里插入图片描述

哦,那你能不能给我讲一下bgsave的工作流程呢?

答: bgsave的工作流程如下图所示,整体可以简述为:

  1. 主进程fork出一个子进程,这时候主进程会被阻塞。
  2. 子进程创建完成后,redis客户端会输出Background saving started,这就意味子进程开始进行持久化操作了。
  3. 子进程持久化完成后,会生成一个rdb文件,将本次的rdb文件通过原子替换的方式将上一次备份的rdb覆盖。
  4. 子进程发送信号通知父进程本次任务完成。

在这里插入图片描述

RDB常见的配置参数有哪些了解嘛?

答: 首先是dbfilename ,它可以指定rdb的文件名


# The filename where to dump the DB
dbfilename dump.rdb

接下来就是dir,它可以指定rdb文件的持久化的位置,默认取redis服务端的位置。

dir ./

reids无法将文件写入磁盘,我们可以讲stop-writes-on-bgsave-error设置为yes,直接关掉redis的写操作,默认为yes


stop-writes-on-bgsave-error yes

rdbcompression 开启后,redis默认会通过LZF算法压缩rdb文件。这种方式会消耗CPU,但是压缩后的大小远远小于内存,但是带来的收益却远远大于这点开销,通过压缩的文件无论是通过网络发送到从节点还是存储到硬盘的空间都是非常可观的。



rdbcompression yes

rdbchecksum 开启后,在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。

rdbchecksum yes

说了那么多,可不可以给我演示一下RDB的使用方式

答: 没问题,我们首先需要存点数据,20s存3个值

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK

完成后查看是否生成rdb文件,确认无误后,我们将这个文件备份,并强制关闭redis服务端,模拟断电的场景


# 重命名rdb文件
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# mv dump.rdb dump.rdb.bak

此时我们再启动redis就会发现数据为空

127.0.0.1:6379> keys *
(empty array)

我们将rdb文件还原,并重启redis,可以发现备份数据还原了

# 强制关闭redis
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# ps -ef |grep redis |grep -v grep
root      8956     1  0 23:22 ?        00:00:00 redis-server 127.0.0.1:6379
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# kill -9 8956

# 还原rdb,并启动redis
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# mv dump.rdb.bak dump.rdb
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-server /root/redis/redis.conf
[root@iZ8vb7bhe4b8nhhhpavhwpZ sbin]# redis-cli

# 可以看到之前设置的数据都回来了
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"

:当我们使用shutdown指令也会自动触发bgsave,读者可以自行测试。

不错,那你可以说说RDB有哪些优缺点嘛?

答: 首先说说优点吧:

  1. rdb是紧凑压缩的二进制文件,非常实用与备份或者全景复制等场景。
  2. rdb恢复数据效率远远高于aof

而缺点如下:

  1. 无法做到毫秒级别的实时性持久化,尽管我们可以通过设置紧凑的save完成持久化,但是频繁的fork子进程进行持久化,很可能造成redis主进行长期阻塞。
  2. 存储的文件是二进制,不够直观,可能还存在某些兼容问题。

进阶

生产环境大内存的redis数据如何在持久化的时候保持数据一致性呢?

答: redis的rdb持久化是基于Copy on write (写时复制思想)redisfork一个子进程完成数据持久化,再此期间发生的原数据修改或者写入的新数据都会生成一个数据副本存到一个新的内存区域中,bgsave子进程快照完成后,再将这块内存区域同步到原来的内存区域中,等待下一次快照。

这样做的缺点也很明显,极端情况下,如果在bgsave期间主进程数据都被改了,那么内存占用就是原来的两倍。

在这里插入图片描述

哦,那在进行快照操作的这段时间,如果发生服务崩溃怎么办?

答: 服务恢复的数据只会是上一次备份的rdb文件数据,因为bgsave子进程只会将操作成功的文件生成rdb文件覆盖上一次备份的文件。

可以每秒做一次快照吗?

答: emmm,可以倒是可以,但是可能会有下面这几个问题:

  1. 频繁写入内存数据会给磁盘带来很大的压力,多个fork子进程抢占优先的磁盘带宽,前一个子进程没写完,后一个子进程又来写入。
  2. rdb持久化每次fork子进程都会阻塞主进程,频繁fork很可能导致主进程长期处于阻塞状态。

参考文献

Redis持久化简介

Redis常见面试题总结(上)

面试必问的 Redis:RDB、AOF、混合持久化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1309309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(三)日志管理(登录日志、操作日志)、用户登录模块

第一篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(一)搭建项目 第二篇:【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(二)日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

赛氪为第五届全球校园人工智能算法精英大赛决赛选手保驾护航

12月10日,以“智青春算未来”为主题的2023年第五届全球校园人工智能算法精英大赛全国总决赛在河海大学江宁校区举行。本次大赛由江苏省人工智能学会主办,自9月份启动以来,共吸引了全国近400所高校的3000多支参赛团队参加。经过校赛、省赛选拔…

Linux(统信UOS) 发布.Net Core,并开启Https,绑定证书

实际开发中,有时会需要为小程序或者需要使用https的应用提供API接口服务,这就需要为.Net Core 配置https,配置起来很简单,只需要在配置文件appsettings.json中添加下面的内容即可 "Kestrel": {"Endpoints": …

LeetCode力扣每日一题(Java)66、加一

每日一题在昨天断开了一天,是因为作者沉迷吉他,无法自拔……竟然把每日一题给忘了,所以今天,发两篇每日一题,把昨天的给补上 一、题目 二、解题思路 1、我的思路 其实乍一看这道题还是比较简单的,就是让…

C/C++ 汇总区间-返回恰好覆盖数组中所有数字的最小有序区间范围列表

给定一个无重复元素的有序数数组ums。返回恰好覆盖数组中所有数字的最小有序区间范围列表。 也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字x。 列表中的每个区间范围 [a,b] 应该按如下格式输出&…

zabbix——实现高效网络监控

在当今的数字化时代,网络和服务器的健康状况对于企业的正常运营至关重要。为了及时发现和解决潜在的问题,许多企业选择使用网络监控工具来追踪服务器的性能和网络参数。其中,Zabbix是一个功能强大且开源的网络监控工具,被广泛应用…

unity 2d 入门 飞翔小鸟 死亡闪烁特效(十三)

一、c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Bling : MonoBehaviour {public Texture img;public float speed;public static bool changeWhite false;private float alpha0f;// Start is called before the fi…

EasyRecovery(数据恢复软件) 2024中文绿色无需激活版下载

EasyRecovery是一款功能强大且专业的数据恢复软件,软件能够对电脑误删的文件进行恢复,包括格式化硬盘是数据恢复、手机U盘数据恢复等,小编今天给大家带来的是根据官软件解压后直接使用。感兴趣的朋友快来下载使用吧。 EasyRecovery-2024mac最…

PCL显示double类型的点云方案

前言 我们知道,PCL和OpenGL等三维可视化软件一样,为了兼顾性能需求,只支持加载Float类型的点云数据,但是当我们对精度要求太高时,Float类型支持不了我们的精度要求,我们的数据必须用Double类型存储才可以&…

Vue 3 开发中遇到的问题及解决方案(fix bug)

开发环境:mac系统,node版本: 16.15.0 版本兼容问题 vite v3.2.4 building for development... hasInjectionContext is not exported by node_modules/pinia/node_modules/vue-demi/lib/index.mjs, imported by node_modules/pinia/dist/pini…

【MySQL命令】show slave status\G 超详细全面解释

这个命令是DBA日常运维中常用来查看主从状态的命令,很多备份,监控工具也会使用到该命令监控主从状态是否正常,主从延迟,获取位点信息等。作为常用日常命令,一定要完全理解该命令的输出。今天主要结合 官方文档 和 实际…

AndroidStudio使用小技巧(持续更新中)

改过一次后,当时还记着;再拿起来,就忘记了。还是记下来吧。 使用鼠标滚轮设置文本的字体大小 左上角 File->Setting->Editor 启动时设置是否自动打开项目 老版本AS会有 Reopen last project on startup新版本AS有 Reopen projects o…

Stable Diffusion - High-Resolution Image Synthesis with Latent Diffusion Models

Paper name High-Resolution Image Synthesis with Latent Diffusion Models Paper Reading Note Paper URL: https://arxiv.org/abs/2112.10752 Code URL: https://github.com/CompVis/latent-diffusion TL;DR 2021 年 runway 和慕尼黑路德维希马克西米利安大学出品的文…

《从入门到精通:AJAX基础知识解析,前端开发中利器》基础篇

目录 学习目标: 学习目录: 学习时间: 学习内容: 什么是 AJAX? 怎么用 AJAX ? 认识 URL 协议 域名 资源路径 获取 - 新闻列表 URL 查询参数 axios-查询参数 常用请求方法和数据提…

【docker】镜像使用(Nginx 示例)

查看本地镜像列表 docker images删除本地镜像 # docker rmi [容器 ID]docker rmi a6bd71f48f68 查找镜像 docker search nginx 参数介绍 NAME: 镜像仓库源的名称DESCRIPTION: 镜像的描述OFFICIAL: 是否 docker 官方发布STARS: 点赞、喜欢AUTOMATED: 自动构建。 拉去镜像 …

动态雨滴个人主页导航页

资源入口 动态雨滴玻璃掉落主页,和之前的两个一个性质,css全部重构,canvas绘制的下雨背景,可以自己去换图片。 原版: 已二次开发(可添加多个导航格及自适应手机端) ------本页内容已结束&#x…

DHTMLX Suite v8.3发布!深化JavaScript UI小部件库使用体验

DHTMLX UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件,这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Suite v8.3已于近日正式发布啦!这个更新附带了一组新特性和改进,旨在促进您…

销售技巧培训之如何提升网络销售技巧

销售技巧培训之如何提升网络销售技巧 随着互联网的普及,网络销售已经成为了一种重要的销售方式。对于许多企业来说,网络销售已经成为了一种重要的销售渠道。但是,要想在网络销售中取得成功,就需要掌握一些网络销售技巧。本文将介…

php 和 python 跨界 合作 phpy搭建 已解决

需求介绍 1、在日常功能开发中,难免会使用python的计算库,同时自己要是一名PHP开发工程师。就在最近有相应的需求,索性使用phpy来进行功能开发 安装 windows版本 phpy 是识沃团队最新推出的开源项目,目标是为 PHP 引入 Python 生…

『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、特点、启动到使用的完整过程

『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、安装、配置到使用的完整过程 1 uiautomatorviewer简介2 uiautomatorviewer特点3 uiautomatorviewer启用4 Work Bar5 Screenshot6 控件布局7 控件属性8 连接设备9 Error while obtaining UI问题排查 1 u…