【Redis】内存数据库 Redis 进阶

news2024/12/31 7:07:45

目录

    • 分布式缓存 Redis
    • Redis 持久化
      • RDB (Redis DataBase)
        • RDB执行时机
        • RDB启动方式——save指令
          • save指令相关配置
          • save指令工作原理
          • save配置自动执行
        • RDB启动方式——bgsave指令
          • bgsave指令相关配置
          • bgsave指令工作原理
        • RDB三种启动方式对比
        • RDB特殊启动形式
        • RDB优点与缺点
      • AOF (Append Only File)
        • AOF写数据三种策略 (appendfsync)
        • AOF相关配置
        • AOF工作流程
        • AOF重写
          • AOF重写作用
          • AOF重写规则
          • AOF重写方式
          • AOF重写流程
      • RDB (Redis DataBase) VS AOF (Append Only File)

分布式缓存 Redis

基于 Redis 集群解决单机 Redis 存在的四大问题:
在这里插入图片描述

Redis 持久化

  防止数据的意外丢失,确保数据安全性,利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。

  持久化过程保存什么:

  • 将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据
  • 将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程
    在这里插入图片描述

RDB (Redis DataBase)

  RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。快照文件称为RDB文件,默认是保存在当前运行目录。
  在进行 RDB 的时候,Redis 的主线程是不会做 IO 操作的,主线程会 fork 一个子线程来完成该操作;Redis 调用 fork,同时拥有父进程和子进程。子进程将数据集写入到一个临时 RDB 文件中。当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
  这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益,因为是使用子进程进行写操作,而父进程依然可以接收来自客户端的请求。fork 采用的是 copy-on-write 技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。
    在这里插入图片描述
    在这里插入图片描述

RDB执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令
  • 执行bgsave命令
  • Redis停机时
    Redis停机时会执行一次save命令,实现RDB持久化。
  • 触发RDB条件时
    save second changes 其中 second:监控时间范围,changes:监控key的变化量。save “” 则表示禁用 RDB

RDB启动方式——save指令

# 手动执行一次保存操作,save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。
save

redis-cli -p 6379
127.0.0.1:6379> 
127.0.0.1:6379> save
OK
# 在redis安装目录的data目录生成dump.rdb文件
save指令相关配置
  • dbfilename dump.rdb
    说明:设置本地数据库文件名,默认值为 dump.rdb
    经验:通常设置为dump-端口号.rdb
  • dir
    说明:设置存储.rdb文件的路径。
    经验:通常设置成存储空间较大的目录中,目录名称data
  • rdbcompression yes
    说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩。
    经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大)。
  • rdbchecksum yes
    说明:设置是否进行 rdb 文件格式校验,该校验过程在写文件和读文件过程均进行。
    经验:通常默认为开启状态,如果设置为 no,可以节约读写性过程约 10% 时间消耗,但是存储一定的数据损坏风险。

在这里插入图片描述
数据恢复演示:

# 关闭redis进程
ps -ef | grep redis-
kill -9 端口号

# 启动redis,观察是否有数据
redis-server conf/redis-6379.conf 
redis-cli -p 6379
>keys *
>"输出" # 关闭前的数据存在,持久化生效
save指令工作原理

在这里插入图片描述

save配置自动执行

  反复执行保存指令,忘记了,不知道数据产生了多少变化,何时保存。由 Redis 服务器发起指令(基于条件)自动执行保存数据。

# 在conf文件中进行配置,重新以配置文件启动,满足限定时间范围内key的变化数量达到指定数量即进行持久化 
# second:监控时间范围,changes:监控key的变化量
save second changes

在这里插入图片描述

RDB启动方式——bgsave指令

  数据量过大,单线程执行方式造成效率过低,需要后台执行( Redis 操作者(用户)发起指令;Redis 服务器控制指令执行)

# 手动启动后台保存操作,但不是立即执行,开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。
bgsave
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 25
OK
127.0.0.1:6379> get age
"25"
127.0.0.1:6379> bgsave
Background saving started

# 保存在dump.rdb
bgsave指令相关配置
  • dbfilename dump.rdb
    说明:设置本地数据库文件名,默认值为 dump.rdb
    经验:通常设置为dump-端口号.rdb
  • dir
    说明:设置存储.rdb文件的路径。
    经验:通常设置成存储空间较大的目录中,目录名称data
  • rdbcompression yes
    说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩。
    经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大)。
  • rdbchecksum yes
    说明:设置是否进行 rdb 文件格式校验,该校验过程在写文件和读文件过程均进行。
    经验:通常默认为开启状态,如果设置为 no,可以节约读写性过程约 10% 时间消耗,但是存储一定的数据损坏风险。
  • stop-writes-on-bgsave-error yes
    说明:后台存储过程中如果出现错误现象,是否停止保存操作。
    经验:通常默认为开启状态。
bgsave指令工作原理

在这里插入图片描述

RDB三种启动方式对比

方式save指令bgsave指令
读写同步异步
阻塞客户端指令
额外内存消耗
启动新进程

RDB特殊启动形式

  • 全量复制
    在主从复制中详细讲解

  • 服务器运行过程中重启
    debug reload

  • 关闭服务器时指定保存数据
    shutdown save
    默认情况下执行 shutdown 命令时,自动执行 bgsave( 如果没有开启AOF持久化功能 )

RDB优点与缺点

RDB优点:

  • RDB 是一个紧凑压缩的二进制文件,存储效率较高。
  • RDB 内部存储的是 Redis 在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景。
  • RDB 恢复数据的速度要比 AOF 快很多。
  • 应用:服务器中每x小时执行 bgsave 备份,并将 RDB 文件拷贝到远程机器中,用于灾难恢复。

RDB缺点:

  • RDB 方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据。
  • bgsave 指令每次运行要执行 fork 操作创建子进程,要牺牲掉一些性能。
  • Redis 的众多版本中未进行 RDB 文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象。

AOF (Append Only File)

解决 RDB 存储的弊端:

  • 存储数据量较大,效率较低 基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低。
  • 大数据量下的 IO 性能较低。
  • 基于 fork 创建子进程,内存产生额外消耗。
  • 宕机带来的数据丢失风险。

解决思路:

  • 不写全数据,仅记录部分数据。
  • 降低区分数据是否改变的难度,改记录数据为记录操作过程。
  • 对所有操作均进行记录,排除丢失数据的风险。

AOF概念
  AOF (append only file) 持久化:以独立日志的方式记录每次写命令,重启时再重新执行 AOF 文件中命令达到恢复数据的目的。
  与 RDB 相比可以简单描述为改记录数据为记录数据产生的过程。AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式。

在这里插入图片描述

AOF写数据三种策略 (appendfsync)

  • always(每次)
    每次写入操作均同步到 AOF 文件中,数据零误差,性能较低。

  • everysec(每秒)
    每秒将缓冲区中的指令同步到 AOF 文件中,数据准确性较高,性能较高。
    在系统突然宕机的情况下丢失 1 秒内的数据。

  • no(系统控制)
    由操作系统控制每次同步到 AOF 文件的周期,整体过程不可控。

在这里插入图片描述

AOF相关配置

# 是否开启AOF功能,默认是no
appendonly yes

# AOF持久化文件名,默认文件名未appendonly.aof,建议配置为appendonly-端口号.aof
appendfilename filename

# AOF持久化文件保存路径,与RDB持久化文件保持一致即可
dir

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

在这里插入图片描述

测试添加数据:

127.0.0.1:6379> set age 55
OK

cat appendonly-6379.aof
...
set
$3
age
$2
55

AOF工作流程

在这里插入图片描述

AOF重写

在这里插入图片描述
  随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,Redis 引入了 AOF 重写机制压缩文件体积。AOF 文件重写是将 Redis 进程内的数据转化为写命令同步到新 AOF 文件的过程。
  简单说就是将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录。

AOF重写作用
  • 降低磁盘占用量,提高磁盘利用率。
  • 提高持久化效率,降低持久化写时间,提高IO性能。
  • 降低数据恢复用时,提高数据恢复效。
AOF重写规则
  • 进程内已超时的数据不再写入文件。
  • 忽略无效指令,重写时使用进程内数据直接生成,这样新的 AOF 文件只保留最终数据的写入命令,如del key1hdel key2srem key3set key4 111set key4 222
  • 对同一数据的多条写命令合并为一条命令,如 lpush list1 alpush list1 blpush list1 c 可以转化为:lpush list1 a b c
  • 为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入 64 个元素。
AOF重写方式
  • 手动重写 (bgrewriteaof 指令)
127.0.0.1:6379> set name 111
OK
127.0.0.1:6379> set name 222
OK
[root@koma data]# cat appendonly-6379.aof

127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

[root@koma data]# cat appendonly-6379.aof

在这里插入图片描述

  • 自动重写
# 自动重写触发条件设置
auto-aof-rewrite-min-size size  # AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-percentage percentage  # AOF文件比上次文件 增长超过多少百分比则触发重写

# 自动重写触发比对参数(运行指令info Persistence获取具体信息)
aof_current_size
aof_base_size

自动重写触发条件:
在这里插入图片描述

AOF重写流程

在这里插入图片描述

RDB (Redis DataBase) VS AOF (Append Only File)

持久化方式RDB (Redis DataBase)AOF (Append Only File)
占用存储空间小(数据级:压缩)大(指令级:重写)
存储速度
恢复速度
数据安全性会丢失数据依据策略决定
资源消耗高 / 重量级低 / 轻量级
启动优先级
  • 对数据非常敏感,建议使用默认的 AOF 持久化方案
    ​AOF持久化策略使用 everysecond,每秒钟 fsync 一次。该策略 Redis 仍可以保持很好的处理性能,当出现问题时,最多丢失 0-1 秒内的数据。
    ​注意:由于 AOF 文件存储体积较大,且恢复速度较慢。
  • 数据呈现阶段有效性,建议使用 RDB 持久化方案
    ​数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人员手工维护的),且恢复速度较快,阶段点数据恢复通常采用 RDB 方案。
  • 综合比对
    RDB 与AOF 的选择实际上是在做一种权衡,每种都有利有弊。
    如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF。
    ​如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB。
    ​灾难恢复选用RDB。
    ​双保险策略,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据的量。

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

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

相关文章

租赁固定资产管理

智能租赁资产管理系统可以为企业单位提供RFID资产管理系统。移动APP资产管理,准确总结易损耗品和固定资金,从入库到仓库库存实时跟踪,控制出库和入库的全过程。同时,备件和耗材与所属资产设备有关,便于备件的申请和管理…

指针进阶详解续---C语言

❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其它语言打好基础,C生万物! 开始我们的C语言之旅吧!✈ 目录 前言: 一.函数指针数组 二.指向函数指针数组的指针 三.回调函数 …

3D WEB轻量化渲染引擎Communicator发布冲突检测库!增加客户端和服务器端冲突检测功能

​HOOPS Communicator是Tech Soft 3D旗下的主流产品之一,具有强大的、专用的高性能图形内核,专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成,提供了HOOPS Convertrer、Data Authoring的模型转换和编辑工…

【Java练习题汇总】《第一行代码JAVA》综合测试二,汇总Java练习题

Java练习题 综合测试二 1️⃣ 综合测试二 1️⃣ 综合测试二 下面( )不属于面向对象的特点。 A. 封装 B. 转型 C. 继承 D. 多态 下面关于类与对象的描述正确的是( )。 A. 任何情况下必须先有类再有对象,对象只能够调用类中定义的方法,不能够调用属性 B.…

大家知道AI智能绘画是什么吗?我将为你解答

最近,我经常看到朋友在朋友圈上一直发美女图,我在想“这小子现在怎么回事,天天发女孩子的图片”。 便去询问了一下,他却笑着对我说;“这些都不是真人,是我ai智能绘画出图的”。 顿时,我就有点懵…

详细谈谈AIO、BIO、NIO 的区别

目录 一、什么是AIO 二、什么是BIO 三、什么是NIO 四、NIO 在 Netty 中的使用 一、什么是AIO AIO(Asynchronous I/O,异步输入输出)是一种处理输入输出的编程模型,它允许同时处理多个输入输出操作,而不需要等待每个…

Activity的自启动模式

以下内容摘自郭霖《第一行代码》第三版 文章目录 Activity的自启动模式1.standard(默认)2.singleTop3.singleTask4.singleInstance Activity的自启动模式 启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance&#x…

java: MultiValueMap

实际就是value为List的map.在较早版本(比如2.3.7)的spring boot 的loadSpringFacotories方法中有使用&#xff0c; 新版本(比如2.6.6&#xff09;已换成Map<String,List> MultiValueMap用法很简单&#xff1a;

资产盘点流程及注意事项

公司在引进固定资产管理的同时&#xff0c;也广泛加快了信息化工作的进程。现代计算机技术、条码技术、条码技术等都不能满足传统的固资管理机制&#xff0c;RFID技术、硬件扫描技术、提高固定资产管理流程、固定资产管理和统计等方面的特殊要求。科学规范地管控企业有形资产的…

日常环境配置

pip install 使用代理 例&#xff1a;代理端口&#xff1a;10808 pip install akshare --proxyhttp://127.0.0.1:10808———— conda 虚拟环境安装pip包 查看虚拟环境地址 conda info --env #查看虚拟环境地址使用–taget 安装pip 包 pip install akshare --target &q…

DataSphere Studio - 1.1.0安装部署 (单机版)

不要采用这种安装方式&#xff01;&#xff01;全部服务启动成功&#xff0c;不报错。页面还是各种报错&#xff0c;效率非常低下。 感谢微信群各位大佬帮助&#xff0c;分享了社区优秀文章中一键自动化部署脚本。 喝咖啡&#xff0c;自动部署&#xff0c;课本上故事成真。 自…

ChatGLM-6B模型使用

一、创建环境 conda create -n chatglm python3.8 conda activate chatglm 二、下载代码 git clone https://github.com/THUDM/ChatGLM-6B.git三、安装依赖 我这里是cuda11.2&#xff0c;根据自己的版本安装&#xff0c;这里是pytorch版本&#xff1a;https://pytorch.org/g…

linux系统编程重点复习--文件和目录操作

目录 复习目标 1.文件IO 2.C标准函数与系统函数的区别 2.1什么是系统调用 2.2 文件描述符 2.3 open函数 2.4 close函数 2.5 read/write 2.5.1read函数 2.5.2 write 2.6 lseek 2.7 perror和errno 2.8 阻塞和非阻塞: 3文件和目录 3.1 stat/lstat函数 3.2 opendir…

在使用Python爬虫时遇到解析错误解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到解析错误是常见的问题之一。解析错误可能是由于网页结构变化、编码问题、XPath选择器错误等原因导致的。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决办法&#xff0c;并给出相关的代码示例&#xff0c;希望对您的爬虫任…

【好书推荐】ChatGPT入门经典《这就是 ChatGPT》

文章目录 一、前言二、通俗易懂三、传奇大佬四、精彩的导读序五、总结 一、前言 目前很少能有一本书&#xff0c;能做到一定深度地普及 ChatGPT 的原理&#xff0c;而这本书可以做到恰到好处地告诉大家&#xff0c;ChatGPT 是如何工作的。 二、通俗易懂 ChatGPT 是一种人工智…

PCB制版技术

1、在头脑里形成一个原理图----现在就下载AD9盖版&#xff0c;诞生了一个问题&#xff0c;电路板去哪里买&#xff0c;买了怎么焊接电路和芯片&#xff0c;怎样流程化批量制作电子产品 1.1 形成一个PCB板&#xff0c;形成一个结构 1.2 焊接&#xff0c;嫁接&#xff0c;组装等 …

低功耗LCD液晶显示驱动厂家1621系列3线/4线接口可驱动32×4COM

型 号&#xff1a;VK1621 / 品 牌&#xff1a;VINKA/永嘉微电 最新年份 M1817 VK1621 是一个324的LCD驱动器&#xff0c;可软体程式控制使其适用于多样化的LCD应用线路&#xff0c;仅用到3至4条信号线便可控制LCD驱动器&#xff0c;除此之外也可介由指令使其進入省电模式 VK1…

Acwing.873.欧拉函数

题目 给定n个正整数ai&#xff0c;请你求出每个数的欧拉函数。 输入格式 第一行包含整数n。 接下来n行&#xff0c;每行包含一个正整数ai。 输出格式 输出共n行&#xff0c;每行输出一个正整数an的欧拉函数。 数据范围 1 ≤n ≤100 1≤ai≤2* 109 输入样例: 3 3 6 8输…

面试官:如何跟非技术人员解释黑盒、白盒、灰盒测试的区别?

​对于黑盒、白盒与灰盒测试方法的理解&#xff0c;几年前我在某乎做过一个概念性的回答&#xff0c;当时提问者询问&#xff1a;如何跟非技术人员解释黑盒、白盒、灰盒测试的区别&#xff1f; 我的回答原文如下&#xff1a; 既然是对非技术人员解释&#xff0c;就不能用专业…

绘制Circos基因圈图

写在前面 昨天在绘制Circos圈图&#xff0c;已经隔了2年左右没有做这类的图了。这时间过得真是快&#xff0c;但是文章和成果依旧是没有很明显的成效。只能安慰自己&#xff0c;后面的时间继续加油吧&#xff01;关于Cirocs图的制作&#xff0c;我从刚开始到现在都是是使用TBt…