`
905766491
  • 浏览: 31701 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

谈谈Memcached与Redis(三)

 
阅读更多

3. Memcached和Redis关键技术对比

作为内存数据缓冲系统,Memcached和Redis均具有很高的性能,但是两者在关键实现技术上具有很大差异,这种差异决定了两者具有不同的特点和不同的适用条件。下面我们会对两者的关键技术进行一些对比,以此来揭示两者的差异。
3.1 Memcached和Redis的内存管理机制对比
对于像Redis和Memcached这种基于内存的数据库系统来说,内存管理的效率高低是影响系统性能的关键因素。传统C语言中的malloc/free函数是最常用的分配和释放内存的方法,但是这种方法存在着很大的缺陷:首先,对于开发人员来说不匹配的malloc和free容易造成内存泄露;其次,频繁调用会造成大量内存碎片无法回收重新利用,降低内存利用率;最后,作为系统调用,其系统开销远远大于一般函数调用。所以,为了提高内存的管理效率,高效的内存管理方案都不会直接使用malloc/free调用。Redis和Memcached均使用了自身设计的内存管理机制,但是实现方法存在很大的差异,下面将会对两者的内存管理机制分别进行介绍。
3.1.1 Memcached的内存管理机制
Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响
Slab Allocation的原理相当简单。 如图3所示,它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制。假定Figure 1中Growth Factor的取值为1.25,所以如果第一组Chunk的大小为88个字节,第二组Chunk的大小就为112个字节,依此类推。
当Memcached接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的Slab Class,然后通过查询Memcached保存着的该Slab Class内空闲Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的Chunk就可以回收,重新添加到空闲列表中。从以上过程我们可以看出Memcached的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如图 4所示,将100个字节的数据缓存到128个字节的Chunk中,剩余的28个字节就浪费掉了。
3.1.2 Redis的内存管理机制
Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了方便内存的管理,在分配一块内存之后,会将这块内存的大小存入内存块的头部。如图 5所示,real_ptr是redis调用malloc后返回的指针。redis将内存块的大小size存入头部,size所占据的内存大小是已知的,为size_t类型的长度,然后返回ret_ptr。当需要释放内存的时候,ret_ptr被传给内存管理程序。通过ret_ptr,程序可以很容易的算出real_ptr的值,然后将real_ptr传给free释放内存。
Redis通过定义一个数组来记录所有的内存分配情况,这个数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标。在源码中,这个数组为zmalloc_allocations。zmalloc_allocations[16]代表已经分配的长度为16bytes的内存块的个数。zmalloc.c中有一个静态变量used_memory用来记录当前分配的内存总大小。所以,总的来看,Redis采用的是包装的mallc/free,相较于Memcached的内存管理方法来说,要简单很多。
分享到:
评论

相关推荐

    memcache与redis

    通过《谈谈Memcached与Redis》这篇文档,我们可以深入理解这两种技术的原理、优缺点,并根据具体需求选择合适的缓存解决方案。同时,文档可能还会涵盖安装配置、优化技巧以及实际案例分析,帮助读者更好地掌握和应用...

    存储cache文档+论文.rar

    此外,还有分布式缓存系统,如Memcached和Redis,它们为应用提供高性能的数据缓存服务,特别适用于数据库的读取优化。 在“PD201909300945191818677”这份文档或论文中,可能详细探讨了上述存储技术的实现、优化...

    互联网 Java 工程师面试题1000道500页

    6. **缓存技术**:Memcached和Redis都是高速缓存,面试中会讨论它们的区别、应用场景、数据结构及操作命令。 7. **数据库**:MySQL是常用的SQL数据库,面试会涉及SQL优化、事务、索引、存储引擎等相关知识。 8. **...

    轻松实现Apache_Tomcat集群和负载均衡

    可以使用分布式会话管理,例如Memcached或Redis来存储会话信息。 2. **修改Tomcat配置**:在每个Tomcat实例的server.xml文件中,添加`<Cluster>`元素,配置集群通信协议(如TCP)和序列化机制。 3. **复制应用程序...

    pHP信电系网站建设设计.zip

    对于性能优化,可以使用索引来加快数据库查询速度,合理设计数据库表结构以减少冗余,以及使用缓存技术如Memcached或Redis来减少数据库访问。 在开发过程中,版本控制工具如Git可以帮助团队协作和管理代码。使用...

    谈谈业务中使用分布式的场景1

    另一种解决方案是利用Memcached这类内存数据库,但效率较低。 **分布式事务**:随着业务复杂度的增加,单体应用的事务管理变得困难。分布式事务解决方案如TCC(Try-Confirm-Cancel),通过预操作、确认和补偿机制...

    谈谈MYSQL那点事.ppt

    架构优化则可能涉及主从复制(Master/Slave)、分表分片、分布式数据库,以及利用缓存服务如Redis或Memcached来缓解数据库压力。此外,优化查询语句、事务管理、数据库设计和数据分布也是提升性能的关键。例如,避免...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.46.docx

    问题 13:请解释 Redis 与 Memcached 的异同,以及它们各自适用的场景。答案:Redis 和 Memcached 都是高性能的内存数据存储,常用于缓存。Redis 支持更多数据结构(如字符串、列表、哈希表等),支持持久化,可以...

    气泡提示与文本框绑定事件与缓存

    在服务器端,应用可能会使用内存缓存(如Redis或Memcached)或数据库缓存来加速数据检索。 综合以上,气泡提示和文本框绑定事件关注的是提升用户体验和增强交互性,而缓存技术则旨在优化性能和响应速度。在实际项目...

    nginx+tomcat的负载均衡session共享和ant构建全流程

    2. 共享存储:使用Redis、Memcached等缓存服务作为共享存储,将Session数据持久化并由所有Tomcat实例访问。 3. 使用Cookie或URL重写来携带Session ID,让服务器根据ID查找对应的Session。 接下来,我们谈谈ANT。Ant...

    saleor的二次开发,微信支付宝支付加入django,saleor上传文件,商品页修改.zip

    例如,使用Redis或Memcached作为缓存系统,以减少数据库查询;利用Celery或其他异步任务框架处理耗时操作,如发送邮件通知、生成PDF发票等,以提高系统响应速度。 总结来说,这个项目涵盖了Saleor的深度定制,包括...

    网络游戏-无线数据网络中的分布式缓存和再分布系统及其方法.zip

    常见的分布式缓存系统有Redis、Memcached等,它们能够提供高并发、低延迟的数据访问。 其次,无线数据网络环境下的网络游戏需要面对带宽限制、网络抖动等问题。分布式缓存通过预加载热门游戏资源到离玩家最近的缓存...

    Galbanum.Orm源代码

    本地缓存适用于单机应用,而分布式缓存适用于多服务器环境,例如使用Redis或Memcached。通过合理利用缓存,可以显著降低数据库负载,提升系统响应速度。 再来说说Galbanum的Logger模块。日志记录对于软件的调试、...

    海量数据库的查询优化及分页算法方案 - CSDNBlog

    4. **数据库缓存**:使用如Redis或Memcached等内存数据库作为缓存,可以存储经常访问的数据,减少对硬盘的读取,提高响应速度。 5. **分区和分片**:将大表分为多个小表,可以分散负载,提高查询效率。分区通常是...

    大型网站技术架构:核心原理与案例分析

    3. **缓存技术**:为了加速数据访问,大型网站会广泛使用缓存,如Redis或Memcached,以减少数据库的读取压力。缓存策略包括页面缓存、对象缓存和数据库查询缓存等。 4. **数据库集群**:单一数据库难以应对大量并发...

    PHP实例开发源码—DSShop TP5框架B2C开源商城源码(单店铺).zip

    8. **性能优化**:缓存技术的应用,如页面静态化、Redis或Memcached的使用,以提高系统响应速度。 9. **SEO优化**:通过设置元标签、URL重写等方式提高搜索引擎的友好性,提升网站的流量。 10. **移动适配**:考虑...

    vagrant安装包2.2.19 windows

    Homestead是Laravel官方推荐的开发环境,它是一个预配置的Vagrant Box,包含了开发Laravel应用所需的所有组件,如Nginx web服务器、PHP、Composer、MySQL、PostgreSQL、Redis、Memcached等。使用Homestead,开发者...

    服务器端代码(异步,大并发)

    6. **缓存优化**:使用缓存(如Redis或Memcached)来减少对后端数据库的访问,降低延迟,提升性能。 7. **数据库优化**:例如使用主从复制、分区、索引等策略,提高数据库的并发处理能力。 8. **硬件升级**:增加...

    PHP面试题(最牛)

    - **缓存机制**:使用缓存策略减轻数据库压力,如Memcached或Redis。 #### 7. PHP的意思 PHP是Hypertext Preprocessor的缩写,是一种通用开源脚本语言,尤其适用于Web开发,可以嵌入HTML中。 #### 8. MYSQL取得...

    一份超级全面的PHP面试题

    - **缓存机制**:使用如Redis等缓存技术来存储常用查询结果,减少数据库负担。 ### 7. PHP的意思(送1分) - **知识点**:PHP代表“PHP: Hypertext Preprocessor”,是一种广泛使用的开源服务器端脚本语言。 ### ...

Global site tag (gtag.js) - Google Analytics