`
yale
  • 浏览: 359916 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Redis考虑虚拟内存设计

 
阅读更多

虚拟内存指当物理内存不够用时,借用硬盘的空间来当作物理内存使用,就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的 内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外的能够提高数据库容量的办法就是使用vm把那些不经常访问的数据交换的磁盘上。如果我们的存储的数据总是有少部分数据被经常访问,大部分数据很少被访问,就拿我们做的大数据量统计报表而言,有些历史数据是不需要经常访问的,就算访问也就是那么几个固定的用户,当少量数据被经常访问时,使用vm不但能提高单台redis server数据库的容量,而且也不会对性能造成太多影响

 

redis没有使用os提供的虚拟内存机制而是自己实现了自己的虚拟内存机制,主要的理由有两点:
1、 redis的集合对象类型如list,set可能存在与多个os页面上。最终可能造成只有10%key被经常访问,但是所有os页面都会被os认为是活跃的,这样只有内存真正耗尽时os才会交换页面。
2、 相比于os的交换方式。redis可以将被交换到磁盘的对象进行压缩,保存到磁盘的对象可以去除指针和对象元数据信息。一般压缩后的对象会比内存中的对象小10倍。这样redis的vm会比os vm能少做很多io操作。

redis的vm在设计上为了保证key的查找速度,只会将value交换到swap文件中。所以如果是内存问题是由于太多value很小的key造成的,那么vm并不能解决。在redis使用的内存没超过vm-max-memory之前是不会交换任何value的。当超过最大内存限制后,redis会选择较老的对象。如果两个对象一样老会优先交换比较大的对象。

 

何时使用
Redis官方文档对VM的使用提出了一些建议: 当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大. 当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value. vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

 

如何使用

要对VM的参数进行相关的配置,这些配置在redis.conf文件中进行配置:

vm-enabled yes                          #开启vm功能
vm-swap-file /tmp/redis.swap         #交换出来的value保存的文件路径/tmp/redis.swap
vm-max-memory   redis使用最大内存上限,超过上限后redis开始交换value到磁盘文件中。
vm-page-size            每个页面的大小(字节)
vm-pages    #最多使用在文件中使用多少页面,交换文件的大小 = vm-page-size * vm-pages
vm-max-threads          #用于执行value对象换入换出的工作线程数量。0表示不使用工作线程

 

官方对vm-max-threads设置说明

当vm-max-threads设为0时(Blocking VM)

主线程定期检查发现内存超出最大上限后,会直接已阻塞的方式,将选中的对象保存到swap文件中,并释放对象占用的内存,此过程会一直重复直到下面条件满足
1.内存使用降到最大限制以下
2.swap文件满了
3.几乎全部的对象都被交换到磁盘了

当有client请求value被换出的key时。主线程会以阻塞的方式从文件中加载对应的value对象,加载时此时会阻塞所以client,然后处理client的请求

 

当vm-max-threads大于0(Threaded VM)

当主线程检测到使用内存超过最大上限,会将选中的要交换的对象信息放到一个队列中交由工作线程后台处理,主线程会继续处理client请求
如果有client请求的key被换出了,主线程先阻塞发出命令的client,然后将加载对象的信息放到一个队列中,让工作线程去加载。加载完毕后工作线程通知主线程。主线程再执行client的命令。这种方式只阻塞请求value被换出key的client

分享到:
评论

相关推荐

    Redis教程(十一):虚拟内存介绍

    Redis的虚拟内存机制是基于Key/Value存储模型设计的。它将经常访问的Keys保留在内存中,而Values根据其访问频率和系统需求可以被换出到磁盘。这一策略尤其适用于那些大部分Keys访问频繁,而Values相对较小且不常访问...

    Redis数据库32位

    Redis数据库32位版本是针对特定...在考虑使用32位Redis时,需要权衡内存效率和可能的数据处理能力,以及是否能够接受潜在的数据淘汰问题。在大多数现代应用中,64位版本的Redis通常能提供更好的性能和更灵活的扩展性。

    Redis64位windows版3.2

    此外,Redis 3.2还引入了虚拟内存(VM)的优化,改善了大数据量场景下的内存管理,使得Redis在处理海量数据时依然能保持高效。 在Windows平台上运行Redis可能需要额外的考虑,因为Redis原生是为Unix-like系统设计的...

    内存碎片的产生

    3. **使用虚拟内存**:虚拟内存系统可以将物理内存和硬盘上的虚拟内存结合,通过页面交换技术,将部分内存写入磁盘,腾出空间,从而缓解内存碎片。 4. **使用内存池**:针对特定大小的内存需求,预先分配一大块内存...

    window下redis安装包完美兼容版

    Redis在Windows环境下可能会受到性能影响,你可以考虑以下优化策略:调整虚拟内存大小,提高硬盘I/O性能,关闭不必要的后台程序,或者使用性能更强的硬件。 9. **监控与备份** 使用`INFO`命令获取Redis的状态信息...

    Redis入门.doc

    5. **虚拟内存管理**:Redis 自行实现了 VM 系统,即使在内存不足时也能优化系统性能。 6. **批处理操作**:Pipelining 功能允许批量发送命令,提高网络传输效率和系统吞吐量。 Redis 的安装和配置相对简单。通常,...

    高可用Redis服务架构设计.docx

    【高可用Redis服务架构设计】 Redis作为一种高性能的内存数据库,广泛应用于web开发中的session存储、热数据缓存、消息队列以及订阅发布系统等场景。然而,为了保证服务的稳定性和可靠性,构建高可用的Redis服务是...

    Redis 60 道面试题及答案.docx

    used_memory:Redis分配器分配的内存总量(单位是字节),包括使用的虚拟内存(即swap)。 used_memory_human:只是显示更友好的used_memory。 used_memory_rss:Redis进程占据操作系统的内存(单位是字节),与...

    Redis集群高可用,主从1

    Redis 支持虚拟内存功能,当内存不足时,可以将部分数据换出到磁盘。然而,这可能导致性能下降,因此一般建议为 Redis 分配足够的物理内存。此外,Redis 提供了 RDB(定期快照)和 AOF(Append-Only File)两种持久...

    Redis-x64-3.2.100,window下可直接执行的redis,自用留存

    - 使用虚拟内存(vm)或AOF/RDB策略来平衡性能和持久化需求。 - 优化网络连接,例如减少不必要的网络延迟。 总结,"Redis-x64-3.2.100"为Windows用户提供了一个便捷的Redis环境,适合个人学习和简单项目使用。...

    聊聊高并发高可用那些事(Kafka、Redis、MySQL)

    8. **双写一致性**:Redis与MySQL之间的数据同步需要考虑一致性问题。 9. **集群模式**:Sentinel监控和自动故障恢复,Cluster实现数据分片。 10. **键槽与槽迁移**:通过一致性哈希确定Key所在的槽,迁移Key以...

    saas-redis:将 Redis 实例作为软件即服务生成

    2. **资源分配**:合理分配Redis实例的内存、CPU和网络资源,以满足不同用户的需求。这可以通过动态调整实例大小、资源配额或者采用集群技术来实现。 3. **高可用性**:提供冗余备份和故障转移机制,保证服务的连续...

    Redis 45 道面试题及答案.docx

    3. 底层实现:两者实现方式和通信协议不同,Redis有自己的虚拟内存机制。 Redis是单进程单线程模型,这使得其处理命令时避免了线程同步的开销,提高了效率。不过,它使用队列技术来处理并发访问,确保数据的一致性...

    Redis集群文档,原理,集群搭建过程,非常细致

    此外,需要注意的是,由于Redis Cluster不支持所有Redis命令,比如某些跨槽的操作(如`MSET`和`SORT`),在设计应用程序时需考虑这些限制。 总之,理解并掌握Redis Cluster的原理和实践,能够有效提升分布式Redis...

    172编程高手必学的内存知识

    现代计算机通常有高速缓存(如L1、L2、L3 Cache)、主内存以及虚拟内存。编程时要考虑数据在这些层次之间的移动,因为它们对性能有着显著影响。例如,CPU缓存命中率直接影响程序执行速度,因此合理的数据布局和访问...

    Lottery:抽奖系统后台springboot + mybatis redis虚拟处理高并发

    而Redis是一个内存数据结构存储系统,可作为数据库、缓存和消息中间件使用,其高速读写能力对处理高并发场景非常有利。 【标签解析】 "系统开源"这个标签表明这个抽奖系统是开源的,意味着源代码可供公众查看、学习...

    Redis集群方案

     1、扩展性,scale-out,以后数据量变得很大之后,不至于推到重来,redis虽然可以开启虚拟内存功能,单机也能提供超过物理内存上限的容量,但频繁在内存和硬盘间swap页会大大降低其性能,有点儿违背redis的设计初衷...

    Laravel框架实现redis集群的方法分析

    Redis是一个开源的高性能键值存储数据库,支持多种类型的数据结构,广泛应用于缓存、会话管理等场景...在实际开发过程中,应当根据应用的规模和性能需求,合理设计和使用Redis集群,以达到最佳的应用性能和数据可用性。

Global site tag (gtag.js) - Google Analytics