REDIS的虚拟内存机制
优秀来自于点滴的积累,我们必将问剑顶峰!!!
最近的自己在涉及高并发和
REDIS
的相关知识点的深挖以及基础夯实,其中在学习REDIS
中的有一点,我认为很有必要写篇博客进行记录下
REDIS
的虚拟内存机制,学过操作系统,想必大家也知道也有个虚拟内存机制(这里我们先思考下:
OS
和REDIS
有什么异同点呢? ~思考下,后面我们一起看,看完就懂了)
本文总纲:
1.操作系统的VM
REDIS
的虚拟内存机制,严格来讲已经在redis2.4
版本就已经删除了,但显然本文的重点醉翁之意不在酒,在乎OS
的虚拟内存也~哈哈,我们耐心往下看
1.VM
为什么我会说
OS
的虚拟内存,我有两个目的:(也是让大家不要被其名字虎住,就是特么一个草台班子!~哈哈哈,好家伙)
- 夯实自己的基本功
- 更好理解
Redis
为何一开始采用,又后面废弃的原因(就是你能更透彻)~任何一个点,我都希望自己能够透过现象看本质,学一个会十个的效果!
好了,我们言归正传(我们先看看这张图)
虚拟内存的概念:
这个名字听得听高大上的,其实也是高大上的~哈哈哈!
那到底是干啥的?
- 首先它是一个抽象的概念,是计算机操作系统中一种内存管理技术
- 虚拟内存就是允许每个进程都能独立的使用比实际无物理内存更多的内存
- 再简而言之: 虚拟内存的主要目的是让计算机能运行比实际物理内存更大的程序,以及更有效地管理内存使用。
- 打个比方:
- 加入你有一个储物柜(实际内存),原本只能存放一储物柜的东西(实际物理内存): 比如放100袋小馒头,
- 但在我们引入虚拟内存技术后,你原本只能放100袋小馒头的储物柜,现在能存放400袋小馒头,
- 这当中的多出来的300袋小馒头就是虚拟内存(~因为实际不存在,储物柜的空间就那么大!)
- 你是不是有疑惑?这怎么这么神奇?咋实现的
- 我再举上面的例子:怎么实现
- 我们原本的储物柜在柜子里面有个闸门(~闸门我们类比虚拟内存置换算法机制)
- ,连通另一个大储物柜(这个大储物柜我们把它理解成磁盘)
- 当我们原储物柜东西塞满,再往里面放的时候,这个闸门就会打开,来存储多出的物品
- 你可能会问?按照上面的例子,为啥就多出300袋呢?
- 这里我是举例子啦!那个大储物柜正好只有300袋空间啦(假设哈!)
~不行,困得要死,快受不了了都—> 原来没吃饱(吃完回来,又活力满满了,~哈哈哈我们继续写)
其中的虚拟内存的工作原理
这张图可以不看哈(纯粹是自己笔记,方便以后自己温故而知新)
- 地址翻译:在使用虚拟内存的系统中,每个程序都会被分配一个独立的虚拟地址空间。当程序访问内存时,CPU中的内存管理单元(MMU)会将虚拟地址转换为实际的物理地址。这个过程称为地址翻译或地址映射。
- 分页和分段:为了高效管理内存,虚拟内存通常被分割成固定大小的块,称为“页”(Page)。每个页都有一个虚拟地址和物理地址的对应关系。分段则是将程序的地址空间按照逻辑划分,比如代码段、数据段等,但现代操作系统多采用分页机制或两者的结合。
- 页面置换算法:当物理内存不足以存放所有需要的虚拟内存页时,操作系统会根据一定的算法选择一个或多个驻留在物理内存中的页将其换出到硬盘上的交换空间(Swap Space),同时将需要访问的页从磁盘换入到物理内存中。常见的页面置换算法有最近最少使用(LRU)、最不经常使用(LFU)、首次适应(FF)、最佳置换算法(OPT,理论上最优,但实际不可实现)等。
- 内存保护:虚拟内存技术还提供了内存保护机制,确保每个进程只能访问自己的内存区域,防止一个程序意外或恶意地修改其他程序的内存数据,提高了系统的稳定性和安全性。
看了这么多,我们来说下Redis
吧
Redis
虚拟内存机制
1.执行大体流程
Redis
提供的虚拟内存机制,它的主要用途其实和我们上面介绍的差不多:主要用途:用于将部分不经常使用的数据存储到磁盘上
大体流程:
- 超过:
- 当
REDIS
的使用内存超过了指定的阈值(通常我们自己设置的maxmemory
)VM
机制会自动将一些键值对转移到磁盘上,从而让内存留出更多的空间- 需要用时
- 执行资源需要被转移到磁盘上的数据,通过虚拟内存机制将自动数据读取到内存中
2.REDIS
配置VM参数(可不看)
强调下,以下配置在
Redis
的新版本中已经无效【在Redis 3.0
及之后的版本中该功能已被移除】,因为Redis
团队转向了其他内存管理和扩展策略,比如Redis Cluster
、持久化策略优化、以及推荐直接增加物理内存等方法。
vm-enabled yes/no
: 此选项用于启用或禁用Redis
的虚拟内存功能。yes
表示启用,no
表示禁用。vm-max-memory <num>
: 设定Redis
在使用虚拟内存之前可以消耗的最大物理内存数量。当Redis内存使用达到这个阈值时,它会开始将较少使用的数据页移动到虚拟内存(swap space
)中。vm-page-size <num>
: 定义了Redis在交换文件中使用的内存页大小。较小的页面尺寸可以减少内存浪费,但会增加内存管理的开销;较大的页面尺寸则相反。vm-pages <num>
: 指定可以用于虚拟内存交换的页面数量。这个值乘以vm-page-size
给出了虚拟内存的最大理论大小。vm-max-threads <num>
: 这个参数控制了在执行内存与磁盘之间数据交换操作时,Redis可以使用的最大线程数。较高的线程数可以加速交换过程,但也可能增加系统负载。
vm-enabled yes
vm-max-memory <num>
vm-page-size <num>
vm-pages <num>
vm-max-threads <num>
注意:
Redis
在2.4版本已经开始废弃了VM
功能(是的,你没看错,就是废弃了),~至于为啥废弃,我们后面说- 且在更改版本中不再推荐使用
3.REDIS
团队为什么移除VM
机制?
主要原因:(我们往下看看,~哈哈哈,别急,已经要完结撒花了!!)
- 性能问题:
- 虚拟内存通过将不常访问的数据交换到磁盘上来扩展可用内存,但这会引入额外的I/O操作。
- 磁盘读写速度远低于内存,频繁的磁盘交换会导致显著的性能下降,特别是在I/O密集型的应用场景下。
Redis
作为一个高性能的内存数据存储系统,其设计初衷是利用内存的速度优势,虚拟内存的使用与其核心设计理念相悖。
- 复杂性增加:
- 虚拟内存管理引入了额外的系统复杂性,
- 包括页面替换策略(如
LRU
等)、内存管理开销、以及线程管理等。 - 这些复杂性不仅增加了
Redis
本身的维护难度,也对用户配置和调优提出了更高要求。(增加工作量!!)
- 更好的替代方案:
- 随着硬件成本的降低(最关键的)和云计算的普及,增加物理内存变得更加容易和经济。
- 此外,
Redis
提供了如RDB
快照和AOF
日志这样的持久化机制,以及Redis Cluster
实现数据的分布式存储,这些都是解决数据量增长和提高系统可靠性的更有效方式。 - 特别是
Redis Cluster
,它允许数据在多个节点间自动分片,从而水平扩展存储容量,而无需依赖虚拟内存技术。
- 社区反馈和使用情况:
Redis
社区和用户在实践中发现,虚拟内存的实际效果往往不如预期,- 尤其是在处理大量并发请求和高吞吐量的应用场景下。
因此,综上所述,继续维护和优化这一功能的需求逐渐减少。
完结撒花
好了,能看到这里,说明你真的很认真的一个学习者!!!给你一个大大的赞!!!~哈哈哈!
我也相信你也收益匪浅吧!~
人生南北多歧路,咱们顶峰见!~哈哈哈