redis的VM机制
所属分类 redis
浏览量 2182
Redis速度快,因为它是基于内存的
如果数据量很大,大到内存放不下时如何处理
使用VM, redis.conf 设置 vm-enabled yes 开启VM功能
通过VM实现冷热数据分离 ,热数据在内存中,冷数据保存到磁盘。
Redis没有使用OS提供的Swap,是自己实现的
1 OS page(4K),粒度太大 ,redis大多数对象远小于4k,一个OS页面上可能有多个redis对象。
另外redis集合对象类型如list,set可能存在与多个OS页面上。
最终可能造成只有10%的key被经常访问,但是所有OS页面都会被OS认为是活跃的,这样只有内存真正耗尽时OS才会交换页面。
2 相比于OS的交换方式 ,redis可以将交换到磁盘的对象进行压缩,保存到磁盘的对象可以去除指针和对象元数据信息。
一般压缩后对象会比内存中对象小10倍 ,redis的vm会比OS vm 少做很多io操作。
3 OS交换会阻塞线程,Redis可设置让工作线程来完成,主线程仍可以继续处理client请求
VM 相关参数
vm-swap-file
vm-max-memory 当内存消耗达到上限时开始交换
vm-page-size 单个页面大小,字节
vm-pages 交换最大大小 vm-page-size * vm-pages
vm-max-threads 交换工作线程数 设置为0表示不使用工作线程而使用主线程,以阻塞方式运行,建议设置成CPU核数。
vm-max-threads = 0
换出
主线程定期检查使用的内存大小,如果发现内存超出最大上限,直接以阻塞的方式,将选中的对象保存到换出文件中,并释放对象占用的内存,此过程会一直重复直到下面条件满足:
1 内存使用降到最大限制以下
2 设置的交换文件数量达到上限
3 几乎全部的对象都被交换到磁盘了
换入
当有client请求的数据被换出时,主线程以阻塞的方式从换出文件中加载对应的数据,加载时阻塞所有client
vm-max-threads > 0
换出
当主线程检测到使用内存超过最大上限,会将要交换的对象信息放到一个队列中交由工作线程后台处理,主线程会继续处理client请求。
换入
如果client请求的数据被换出,主线程先阻塞当前client,然后将加载对象的信息放到一个队列中,让工作线程去加载,主线程继续处理其他client请求。
加载完毕后工作线程通知主线程,主线程再执行被阻塞的client的命令 ,这种方式只阻塞单个client。
VM缺点
slow restart 重启太慢
slow saving 保存数据太慢
slow replication 复制 太慢
complex code 代码过于复杂
有可能废弃
上一篇
下一篇
Timer already cancelled 异常分析
drools简介及实例
redis单线程为什么还那么快
rocketmq知识点
链式调用优缺点
CountDownLatch 与 CyclicBarrier