智能摘要文章源自JAVA秀-https://www.javaxiu.com/36388.html
我相信多数人还是拒绝选择躺平的,今天我们一起来了解一下,Redis的VM机制。VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。如果设置太小,一个value对象就会占用几个数据页面,如果设置太大,就会造成页面空闲空间浪费。当主线程检测到使用内存超过最大上限,会将选中的要交换的数据放到一个队列中交由工作线程后台处理,主线程会继续处理client请求。文章源自JAVA秀-https://www.javaxiu.com/36388.html
原文约 4123 字 | 图片 6 张 | 建议阅读 9 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/36388.html
拒绝躺平,Redis选择实现了自己的VM
点击关注 ? 芋道源码 文章源自JAVA秀-https://www.javaxiu.com/36388.html
收录于话题文章源自JAVA秀-https://www.javaxiu.com/36388.html
#芋道源码文章源自JAVA秀-https://www.javaxiu.com/36388.html
164个文章源自JAVA秀-https://www.javaxiu.com/36388.html
点击上方“芋道源码”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/36388.html
管她前浪,还是后浪?文章源自JAVA秀-https://www.javaxiu.com/36388.html
能浪的浪,才是好浪!文章源自JAVA秀-https://www.javaxiu.com/36388.html
每天 8:55 更新文章,每天掉亿点点头发...文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章源自JAVA秀-https://www.javaxiu.com/36388.html 源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/36388.html
原创 | Java 2020 超神之路,很肝~文章源自JAVA秀-https://www.javaxiu.com/36388.html
中文详细注释的开源项目文章源自JAVA秀-https://www.javaxiu.com/36388.html
RPC 框架 Dubbo 源码解析文章源自JAVA秀-https://www.javaxiu.com/36388.html
网络应用框架 Netty 源码解析文章源自JAVA秀-https://www.javaxiu.com/36388.html
消息中间件 RocketMQ 源码解析文章源自JAVA秀-https://www.javaxiu.com/36388.html
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析文章源自JAVA秀-https://www.javaxiu.com/36388.html
作业调度中间件 Elastic-Job 源码解析文章源自JAVA秀-https://www.javaxiu.com/36388.html
分布式事务中间件 TCC-Transaction 源码解析文章源自JAVA秀-https://www.javaxiu.com/36388.html
Eureka 和 Hystrix 源码解析文章源自JAVA秀-https://www.javaxiu.com/36388.html
Java 并发源码文章源自JAVA秀-https://www.javaxiu.com/36388.html
来源:codenong.com/cs106843764文章源自JAVA秀-https://www.javaxiu.com/36388.html
Redis 之 VM 机制文章源自JAVA秀-https://www.javaxiu.com/36388.html
VM 相关配置文章源自JAVA秀-https://www.javaxiu.com/36388.html
VM 的工作机制文章源自JAVA秀-https://www.javaxiu.com/36388.html
「第一种:vm-max-threads = 0」文章源自JAVA秀-https://www.javaxiu.com/36388.html
「第二种:vm-max-threads > 0」文章源自JAVA秀-https://www.javaxiu.com/36388.html
总结
文章源自JAVA秀-https://www.javaxiu.com/36388.html
Redis 源码中有很多优秀的实践,值得我们学习。它作为开源作品之一,汇聚了众多开源智慧,深受广大程序员喜爱。它的优秀还导致了不少人都喜欢研究它,面试官也喜欢提问面试者,也使整个行业进入了更深的内卷。文章源自JAVA秀-https://www.javaxiu.com/36388.html
我相信多数人还是拒绝选择躺平的,今天我们一起来了解一下,Redis 的 VM 机制。文章源自JAVA秀-https://www.javaxiu.com/36388.html
Redis 之 VM 机制
Redis 的 VM (虚拟内存)机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过 VM 功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。Redis 提高数据库容量的办法有两种:一种是可以将数据分割到多个 Redis Server上;另一种是使用虚拟内存把那些不经常访问的数据交换到磁盘上。「需要特别注意的是 Redis 并没有使用 OS 提供的 Swap,而是自己实现。」文章源自JAVA秀-https://www.javaxiu.com/36388.html
Redis 为了保证查找的速度,只会将 value 交换出去,而在内存中保留所有的 Key。所以它非常适合 Key 很小,Value 很大的存储结构。如果 Key 很大,value 很小,那么vm可能还是无法满足需求。文章源自JAVA秀-https://www.javaxiu.com/36388.html
VM 相关配置
通过在 redis 的 redis.conf 文件里,设置 VM 的相关参数来实现数据在内存和磁盘之间 换入和 换出操作。相关配置如下:文章源自JAVA秀-https://www.javaxiu.com/36388.html
#开启vm功能vm-enabled yes#交换出来的value保存的文件路径vm-swap-file /tmp/redis.swap#设置当内存消耗达到上限时开始将value交换出来vm-max-memory 1000000#设置单个页面的大小,单位是字节vm-page-size 32#设置最多能交换保存多少个页到磁盘vm-pages 13417728#设置完成交换动作的工作线程数,设置为0表示不使用工作线程而使用主线程,这会以阻塞的方式来运行。建议设置成CPU核个数vm-max-threads 4
redis 规定同一个数据页面只能保存一个对象,但一个对象可以保存在多个数据页面中。在 redis 使用的内存没超过 vm-max-memory 时,是不会交换任何 value 到磁盘上的。当超过最大内存限制后,redis 会选择较老的对象(如果两个对象一样老会优先交换比较大的对象)将它从内存中移除,这样会更加节约内存。文章源自JAVA秀-https://www.javaxiu.com/36388.html
对于 Redis 来说,一个数据页面只会保存一个对象,也就是一个 Value 值,所以应该将 vm-page-size 设置成大多数 value 可以保存进去。如果设置太小,一个 value 对象就会占用几个数据页面,如果设置太大,就会造成页面空闲空间浪费。文章源自JAVA秀-https://www.javaxiu.com/36388.html
VM 的工作机制
redis 的 VM 的工作机制分为两种:一种是 vm-max-threads=0,一种是 vm-max-threads > 0。文章源自JAVA秀-https://www.javaxiu.com/36388.html
「第一种:vm-max-threads = 0」
数据换出:
文章源自JAVA秀-https://www.javaxiu.com/36388.html
主线程定期检查使用的内存大小,如果发现内存超出最大上限,会直接以阻塞的方式,将选中的对象 换出 到磁盘上(保存到文件中),并释放对象占用的内存,此过程会一直重复直到下面条件满足任意一条才结束:文章源自JAVA秀-https://www.javaxiu.com/36388.html
1、内存使用降到最大限制以下。2、设置的交换文件数量达到上限。3、几乎全部的对象都被交换到磁盘了。文章源自JAVA秀-https://www.javaxiu.com/36388.html
数据换入:
文章源自JAVA秀-https://www.javaxiu.com/36388.html
当有 client 请求 key 对应的 value 已被换出到磁盘中时,主线程会以阻塞的方式从换出文件中加载对应的 value 对象,加载时此时会阻塞所有 client,然后再处理 client 的请求。「这种方式会阻塞所有的 client。」文章源自JAVA秀-https://www.javaxiu.com/36388.html
「第二种:vm-max-threads > 0」
数据换出:
文章源自JAVA秀-https://www.javaxiu.com/36388.html
当主线程检测到使用内存超过最大上限,会将选中的要交换的数据放到一个队列中交由工作线程后台处理,主线程会继续处理 client 请求。文章源自JAVA秀-https://www.javaxiu.com/36388.html
数据换入:
文章源自JAVA秀-https://www.javaxiu.com/36388.html
当有 client 请求 key 的对应的 value 已被换出到磁盘中时,主线程先阻塞当前 client,然后将加载对象的信息放到一个队列中,让工作线程去加载,此时进主线程继续处理其他 client 请求。加载完毕后工作线程通知主线程,主线程再执行被阻塞的 client 的命令。「这种方式只阻塞单个 client。」文章源自JAVA秀-https://www.javaxiu.com/36388.html
总结
Redis 直接自己构建了 VM 机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去 移动 和 请求,而 Redis 不存在。这也是 Redis 能够那么快的一个原因之一了。文章源自JAVA秀-https://www.javaxiu.com/36388.html
- END -文章源自JAVA秀-https://www.javaxiu.com/36388.html
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章源自JAVA秀-https://www.javaxiu.com/36388.html
已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章源自JAVA秀-https://www.javaxiu.com/36388.html
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/36388.html
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/36388.html
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章源自JAVA秀-https://www.javaxiu.com/36388.html
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)文章源自JAVA秀-https://www.javaxiu.com/36388.html
阅读原文文章源自JAVA秀-https://www.javaxiu.com/36388.html

评论