Redis:持久化、线程模型、大 key

Redis持久化方式有什么方式?

Redis 的读写操作都是在内存中,所以 Redis 性能才会高,但是当 Redis 重启后,内存中的数据就会丢失,那为了保证内存中的数据不会丢失,Redis 实现了数据持久化的机制,这个机制会把数据存储到磁盘,这样在 Redis 重启就能够从磁盘中恢复原有的数据。

Redis 持久化的方式有两种:

  • AOF 日志:每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里;
  • RDB 快照:将某一时刻的内存数据,以二进制的方式写入磁盘;

AOF 日志是如何实现的?

Redis 在执行完一条写操作命令后,就会把该命令以追加的方式写入到一个文件里,然后 Redis 重启时,会读取该文件记录的命令,然后逐一执行命令的方式来进行数据恢复。

在这里插入图片描述

我这里以「set name xiaolin」命令作为例子,Redis 执行了这条命令后,记录在 AOF 日志里的内容如下图:

在这里插入图片描述

Redis 提供了 3 种写回硬盘的策略,在 Redis.conf 配置文件中的 appendfsync 配置项可以有以下 3 种参数可填:

  • Always,这个单词的意思是「总是」,所以它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;
  • Everysec,这个单词的意思是「每秒」,所以它的意思是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘;
  • No,意味着不由 Redis 控制写回硬盘的时机,转交给操作系统控制写回的时机,也就是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。

我也把这 3 个写回策略的优缺点总结成了一张表格:

在这里插入图片描述

RDB 快照是如何实现的呢?

因为 AOF 日志记录的是操作命令,不是实际的数据,所以用 AOF 方法做故障恢复时,需要全量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢。

为了解决这个问题,Redis 增加了 RDB 快照。所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬间的画面和信息就记录到了一张照片。

所以,RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。

因此在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 高些,因为直接将 RDB 文件读入内存就可以,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。

Redis 提供了两个命令来生成 RDB 文件,分别是 savebgsave,他们的区别就在于是否在「主线程」里执行:

  • 执行了 save 命令,就会在主线程生成 RDB 文件,由于和执行操作命令在同一个线程,所以如果写入 RDB 文件的时间太长,会阻塞主线程;
  • 执行了 bgsave 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞;

Redis 是单线程还是多线程?

Redis 单线程指的是

「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」

这个过程是由一个线程(主线程)来完成的,这也是我们常说 Redis 是单线程的原因。

但是,Redis 程序并不是单线程的,Redis 在启动的时候,是会**启动后台线程(BIO)**的:

Redis 在 2.6 版本,会启动 2 个后台线程,分别处理关闭文件、AOF 刷盘这两个任务;

Redis 在 4.0 版本之后,新增了一个新的后台线程,用来异步释放 Redis 内存,也就是 lazyfree 线程。

例如执行 unlink key / flushdb async / flushall async等命令,会把这些删除操作交给后台线程来执行,好处是不会导致 Redis 主线程卡顿。因此,当我们要删除一个大 key 的时候,不要使用 del 命令删除,因为 del 是在主线程处理的,这样会导致 Redis 主线程卡顿,因此我们应该使用 unlink 命令来异步删除大key

Redis 在 6.0 版本之后,采用了多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,Redis 的性能瓶颈有时会出现在网络 I/O 的处理上。但是对于命令的执行,Redis 仍然使用单线程来处理

Redis大key会有什么问题?怎么解决?

大 key 会带来以下四种影响:

  • 客户端超时阻塞。由于 Redis 执行命令是单线程处理,然后在操作大 key 时会比较耗时,那么就会阻塞 Redis,从客户端这一视角看,就是很久很久都没有响应。
  • 引发网络阻塞。每次获取大 key 产生的网络流量较大,如果一个 key 的大小是 1 MB,每秒访问量为 1000,那么每秒会产生 1000MB 的流量,这对于普通千兆网卡的服务器来说是灾难性的。
  • 阻塞工作线程。如果使用 del 删除大 key 时,会阻塞工作线程,这样就没办法处理后续的命令。
  • 内存分布不均。集群模型在 slot 分片均匀情况下,会出现数据和查询倾斜情况,部分有大 key 的 Redis 节点占用内存多,QPS 也会比较小。

解决方式:

  • 拆分成多个小key。这是最容易想到的办法,降低单key的大小,读取可以用mget批量读取
  • 设置合理的过期时间。为每个key设置过期时间,并设置合理的过期时间,以便在数据失效后自动清理,避免长时间累积的大Key问题。
  • 启用内存淘汰策略。启用Redis的内存淘汰策略,例如LRU(Least Recently Used,最近最少使用),以便在内存不足时自动淘汰最近最少使用的数据,防止大Key长时间占用内存。
  • 数据分片。例如使用Redis Cluster将数据分散到多个Redis实例,以减轻单个实例的负担,降低大Key问题的风险。
  • 删除大key。使用UNLINK命令删除大key,UNLINK命令是DEL命令的异步版本,它可以在后台删除Key,避免阻塞Redis实例。

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

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

相关文章

宠物食品药品小程序有哪些功能

现在很多人都喜欢养宠物,这带动了宠物相关产业链,例如宠物医院、宠物清理、宠物食品、宠物玩具、宠物药品等。那么今天就介绍宠物食品药品小程序有哪些功能,以帮助您更好地为宠物行业的客户提供服务。 1. **商品展示**:宠物食品小…

二分查找注意事项

目录 1解题思路:首先二分查找分为左闭右闭和左闭右开两种情况,二种情况在细节处理上有所不同 2左闭右闭情况 3左闭右开 4总结: 1解题思路:首先二分查找分为左闭右闭和左闭右开两种情况,二种情况在细…

算法打卡day13|二叉树篇02|Leetcode 102.二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

在做题之前说明 Deque和Queue 在Java中,Deque和Queue是两种不同的数据结构接口,它们都继承自Collection接口;Deque是Queue的超集,提供了更多的操作和灵活性,以下它们之间存在一些关键的区别: 操作范围&…

【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug

文章目录 前言 时间阈值断点 信号阈值断点 周期步进 Signal Value Lable Data Inspector 分析和应用 总结 前言 近期在一些研发项目中使用Matlab/Simulink时,遇到了挺多费时费力的事情。所以利用晚上和周末时间,在这些方面深入研究了一下&#x…

GPT实战系列-LangChain的OutPutParser解析器

GPT实战系列-LangChain的OutPutParser解析器 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

leetcode 3.11

leetcode hot 100 二分查找1.寻找旋转排序数组中的最小值 矩阵1.搜索二维矩阵 II知识点:upper_bound, lower_bound知识点:二分查找 2.搜索二维矩阵 链表1.合并两个有序链表2.两数相加3. 删除链表的倒数第 N 个结点 二分查找 1.寻找旋转排序数组中的最小…

复习C语言基础中的基础:C语言发展、C89 C99有何区别、C语言特点

参考《C程序设计(第五版)》(谭浩强)一书: 1. 发展、C89 C99 2. 特点 记得时不时回顾一下背景特点,加深对C语言的理解。

git的实际运用

1. SSH配置和Github仓库克隆 注意博主在这里演示的SSH密钥生成方式,下面追加的五行不成功时可手动到.ssh下的config文件中添加即可 $ tail -5 config Host github.comHostName github.comPreferredAuthentications publickeyIdentityFile ~/.ssh/test 演示 2. 关联…

数据完整性

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 数据完整性 数据完整性是关系数据库的一个重要特征,一般包含实体完整性、参照完整性和用户自定义完整性 3 种 实体完整性 实体完整性:规定表中的每…

QML| QML 组件

# | QML 组件 | 组件是可重用的、封装好的QML类型,并提供了定义好的接口。组件一般使用一个.qml文件定义。前面讲到的使用QML文档定义对象类型,其实就是创建了一个组件。这种使用独立QML文件创建组件的方法这里不再讨论。除了使用单独的QML文件,还可以使用Component类型在一…

如何规范员工上网行为(规范员工上网行为的有效方法)

有很多企业会有员工管理问题,比如以下几位老板的担忧: 可见,很多企业都想要对员工上网行为进行管理。 我想企业要对员工上网行为进行规范管理,肯定也是出于多方面的考量。这些考量可能涵盖了工作效率、信息安全、网络带宽利用以及…

2024 ICDE | 时间序列(Time Series)论文总结

第40届IEEE数据工程国际会议(ICDE2024 )于5月13日到17日在荷兰乌德勒支召开。 本届ICDE Research共接收论文375篇,Industry and Application接受论文21篇。本文总结了ICDE 2024上有关时间序列(Time Series)的工作&…

C语言-存储期2.0

静态存储期 在数据段中分配的变量,统统拥有静态存储期,因此也都被称为静态变量。这里静态的含义,指的是这些变量的不会因为程序的运行而发生临时性的分配和释放,它们的生命周期是恒定的,跟整个程序一致。 静态变量包含…

一文轻松学会远程服务器/docker内 vscode,调试(debug)无/多参数/bash以及多工作空间运行的python程序,欢迎大佬补充,一起学习

至于如何SSH、docker以及无需参数的程序调试这篇就先不说了。本篇文章主要记录一下多参数和多工作空间调试的问题。 一、launch.json文件 如上图所示,正常情况下当我们想要调试项目名字为0的目录下的train.py文件时,我们会按顺序点1,2&#…

防范服务器被攻击:查询IP地址的重要性与方法

在当今数字化时代,服务器扮演着重要的角色,为企业、组织和个人提供各种网络服务。然而,服务器也成为了网络攻击者的目标之一,可能面临各种安全威胁,例如DDoS攻击、恶意软件攻击、数据泄露等。为了有效地防范服务器被攻…

用 docker 创建 jmeter 容器, 实现性能测试,该如何下手?

用 docker 创建 jmeter 容器, 实现性能测试 我们都知道,jmeter可以做接口测试,也可以用于性能测试,现在企业中性能测试也大多使用jmeter。docker是最近这些年流行起来的容器部署工具,可以创建一个容器,然后把项目放到…

Navicat破解 Navicat下载安装 附教程 免费

百度网盘:https://pan.baidu.com/s/1wRRN_18_uXxPiIWCS4l43A 麻烦各位师傅帮忙填写一下问卷,提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 (资料来源于网络,侵告删)

【护网资料】 应急响应 安全设备 告警分析 蓝中必看 HVV 护网行动

百度网盘:https://pan.baidu.com/s/1wDVamgkyXwP-yiWN4jPEGQ 麻烦各位师傅帮忙填写一下问卷,提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 (资料来源于网络,侵告删)

【CTF笔记】 CTF web方向笔记分享 免费 附预览图

个人不怎么记东西,笔记不多,师傅们凑合看… 百度网盘:https://pan.baidu.com/s/1PspihUX28Y_AOQZPurHqKA 麻烦各位师傅帮忙填写一下问卷,提取码在问卷填写结束后显示~ 【https://www.wjx.cn/vm/mBBTTKm.aspx# 】 (…

重学SpringBoot3-路径匹配机制

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-路径匹配机制 AntPathMatcherPathPatternParser 和 PathPattern演示AntPathMatcher 示例PathPattern 示例性能和精确度的提升 选择使用哪一种 在 Spring…