乐趣区

关于java:拒绝躺平Redis-实现了自己的-VM

Redis 的 VM(虚拟内存)机制就是临时把不常常拜访的数据 (冷数据) 从内存替换到磁盘中,从而腾出贵重的内存空间用于其它须要拜访的数据(热数据)。

通过 VM 性能能够实现冷热数据拆散,使热数据仍在内存中、冷数据保留到磁盘。这样就能够防止因为内存不足而造成访问速度降落的问题。

Redis 进步数据库容量的方法有两种:

1、一种是能够将数据宰割到多个 Redis Server 上;

2、另一种是应用虚拟内存把那些不常常拜访的数据交换到磁盘上。

须要特地留神的是 Redis 并没有应用 OS 提供的 Swap,而是本人实现。

Redis 为了保障查找的速度,只会将 value 替换进来,而在内存中保留所有的 Key。所以它非常适合 Key 很小,Value 很大的存储构造。如果 Key 很大,value 很小,那么 vm 可能还是无奈满足需要。

1、VM 相干配置

通过在 redis 的 redis.conf 文件里,设置 VM 的相干参数来实现数据在内存和磁盘之间 换入和 换出操作。相干配置如下:

# 开启 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 会抉择较老的对象 (如果两个对象一样老会优先替换比拟大的对象) 将它从内存中移除,这样会更加节约内存。

对于 Redis 来说,一个数据页面只会保留一个对象,也就是一个 Value 值,所以应该将 vm-page-size 设置成大多数 value 能够保留进去。如果设置太小,一个 value 对象就会占用几个数据页面,如果设置太大,就会造成页面闲暇空间节约。

2、VM 的工作机制

redis 的 VM 的工作机制分为两种:一种是 vm-max-threads=0,一种是 vm-max-threads>0。

第一种:vm-max-threads = 0

数据换出:

主线程定期检查应用的内存大小,如果发现内存超出最大下限,会间接以阻塞的形式,将选中的对象 换出 到磁盘上(保留到文件中),并开释对象占用的内存,此过程会始终反复直到上面条件满足任意一条才完结:

1. 内存应用降到最大限度以下。

2. 设置的交换文件数量达到下限。

3. 简直全副的对象都被替换到磁盘了。

数据换入:

当有 client 申请 key 对应的 value 已被换出到磁盘中时,主线程会以阻塞的形式从换出文件中加载对应的 value 对象,加载时此时会阻塞所有 client,而后再解决 client 的申请。这种形式会阻塞所有的 client。

第二种:vm-max-threads > 0

数据换出:

当主线程检测到应用内存超过最大下限,会将选中的要替换的数据放到一个队列中交由工作线程后盾解决,主线程会持续解决 client 申请。

数据换入:

当有 client 申请 key 的对应的 value 已被换出到磁盘中时,主线程先阻塞以后 client,而后将加载对象的信息放到一个队列中,让工作线程去加载,此时进主线程持续解决其余 client 申请。加载结束后工作线程告诉主线程,主线程再执行被阻塞的 client 的命令。这种形式只阻塞单个 client。

总结:Redis 间接本人构建了 VM 机制,不会像个别的零碎会调用零碎函数解决,会节约肯定的工夫去 挪动 和 申请,而 Redis 不存在。这也是 Redis 可能那么快的一个起因。

原文链接:https://blog.csdn.net/Seky_fe…

版权申明:本文为 CSDN 博主「有盐学生」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版