redis学习笔记之虚拟内存
来源:互联网 发布:荣耀盒子电视直播软件 编辑:程序博客网 时间:2024/05/21 15:47
首先说明下redis的虚拟内存与os的虚拟内存不是一码事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的 内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外的能够提高数据库容量的办法就是使用vm把那些不经常访问的数据交换的磁盘上。如果我们的存储的数据总是有少部分数据被经常访问,大 部分数据很少被访问,对于网站来说确实总是只有少量用户经常活跃。当少量数据被经常访问时,使用vm不但能提高单台redis server数据库的容量,而且也不会对性能造成太多影响。
redis没有使用os提供的虚拟内存机制而是自己在用户态实现了自己的虚拟内存机制。
主要的理由有两点
1.os 的虚拟内存是已4k页面为最小单位进行交换的。而redis的大多数对象都远小于4k,所以一个os页面上可能有多个redis对象。另外redis的集 合对象类型如list,set可能存在与多个os页面上。最终可能造成只有10%key被经常访问,但是所有os页面都会被os认为是活跃的,这样只有内 存真正耗尽时os才会交换页面。
2.相比于os的交换方式。redis可以将被交换到磁盘的对象进行压缩,保存到磁盘的对象可以去除指针和对象元数据信息。一般压缩后的对象会比内存中的对象小10倍。这样redis的vm会比os vm能少做很多io操作。
下面是vm相关配置
vm-enabled yes #开启vm功能
vm-swap-file /tmp/redis.swap #交换出来的value保存的文件路径/tmp/redis.swap
vm-max-memory 1000000 #redis使用的最大内存上限,超过上限后redis开始交换value到磁盘文件中。
vm-page-size 32 #每个页面的大小32个字节
vm-pages 134217728 #最多使用在文件中使用多少页面,交换文件的大小 = vm-page-size * vm-pages
vm-max-threads 4 #用于执行value对象换入换出的工作线程数量。0表示不使用工作线程(后面介绍)
redis的vm在设计上为了保证key的查找速度,只会将value交换到swap文件中。所以如果是内存问题是由于太多value很小的key造成 的,那么vm并不能解决。和os一样redis也是按页面来交换对象的。redis规定同一个页面只能保存一个对象。但是一个对象可以保存在多个页面中。 在redis使用的内存没超过vm-max-memory之前是不会交换任何value的。当超过最大内存限制后,redis会选择较老的对象。如果两个 对象一样老会优先交换比较大的对象,精确的公式swappability = age*log(size_in_memory)。 对于vm-page-size的设置应该根据自己的应用将页面的大小设置为可以容纳大多数对象的大小。太大了会浪费磁盘空间,太小了会造成交换文件出现碎 片。对于交换文件中的每个页面,redis会在内存中对应一个1bit值来记录页面的空闲状态。所以像上面配置中页面数量(vm-pages 134217728 )会占用16M内存用来记录页面空闲状态。vm-max-threads表示用做交换任务的线程数量。如果大于0推荐设为服务器的cpu core的数量。如果是0则交换过程在主线程进行。
- redis学习笔记之虚拟内存
- redis学习笔记之虚拟内存
- redis学习笔记之虚拟内存
- 九.redis学习笔记之虚拟内存
- 九.redis学习笔记之虚拟内存
- 九 redis学习笔记之虚拟内存
- 九.redis学习笔记之虚拟内存
- redis学习笔记九之虚拟内存
- redis学习笔记九之虚拟内存
- 九 redis学习笔记之虚拟内存
- Redis学习笔记12(虚拟内存)
- Redis学习笔记十一、虚拟内存
- Redis 学习笔记7-虚拟内存
- 虚拟内存的使用--Redis学习笔记九
- Redis学习手册(虚拟内存)
- Redis学习手册(虚拟内存)
- windows学习笔记之探索虚拟内存
- redis数据库之VM(虚拟内存)
- Toast类避免显示时间叠加的方法
- MySQL安装和设置图解
- 精益——通往涅槃之路上的生存策略
- 查看是否有摄像头和麦克风权限
- Android HTTPS 自制证书实现双向认证(OkHttp + Retrofit + Rxjava)
- redis学习笔记之虚拟内存
- 形参和实参有何区别
- Spring Boot起步依赖源码分析(二)
- java socket 简单通信
- SQL优化:创建索引,导致insert语句长时间等待
- intellj idea 如何设置类头注释和方法注释
- CentOS6.5安装Memcached1.4.25及配置
- JavaScript中的ArrayBuffer详细介绍
- JAVA设计模式之外观模式