缓存使用中Redis,Memcached的共性和差异分析

本文深入分析了Redis和Memcached作为高并发场景下缓存应用解决方案的原因,以及它们在不同场景下的使用策略。重点探讨了它们在数据存储、性能、持久性和可靠性方面的差异,帮助开发者在实际项目中做出更合适的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

     在各大互联网项目的业务场景中,Redis和Memcached都已经是必不可少的高并发场景缓存应用解决方案,本文将从为什么要用redis,memcached和什么时候使用Redis,什么时候使用Memcached两个角度来分析。

     一.为什么要用Redis,Memcached

         随着互联网产品技术的不断纵深发展,数据存储方案主要分为了两个方向,持久存储和临时存储(缓存)。

         作为持久存储的解决方案,现在当属Mysql大行其道,高大上的阿里再不缺钱,也开始在好几年前去IOE,不花冤枉钱,完成向开源产品Mysql的迁移,虽然最近又在开始大部分项目迁往自研的oceanbase,腾讯,百度,新浪,微博也是绝大部分核心产品基于Mysql,核心服务几乎都只相信Mysql,当然大家都有对官方发布的mysql版本有一定的优化和改进,只有部分大数据产品,对可靠性没有100%要求的敢于使用Hbase这种大数据存储系统。像Mongodb这种 NOSQL产品的代表,由于其许多方面还具有不可靠性,几乎还没听说有大型商业项目有对其敢作为核心服务数据库使用,总之一句话,在无论大中小的互联网项目中,Mysql几乎都是一切首选的数据库管理系统。

         但是单个实例的Mysql,能够负载的量级几乎都是qps千级已是极限,在高并发场景,依靠一直堆服务器总不是长久之道,并且在突然的峰值,sql响应延迟,实例升缩扩展都是远水不解近火,在这种场景下,缓存服务应运而生,经过各种项目实践验证,若项目其他业务模块没有瓶颈,单个实例下Redis,Memcached在qps 10万级都能表现良好,部署分布式缓存服务,几乎微博,微信这种量级的产品,核心服务响应峰值百万甚至更高量级请求处理也不是难事。

 

      二.什么时候使用Redis,什么时候使用Memcached。

           要明白各自的使用场景,就要先知道他们的共同点和差异点。

           共同点:

          1.Memcached与Redis都属于内存内、键值数据存储方案,都是nosql数据库中的杰出代表。

          2.几乎所有主流程序设计语言都有支持memcached和redis的客户端库,上手容易,门槛极低。

          3.两者都是数据存储于内存,这也导致两者几乎有相同的特征(与指标)表现、负载的数据吞吐量与延迟状况。

          4.Memcached与Redis服务端都可以在几分钟内极易安装,对于学习者成本极低。

          5.Memcached没有身份验证,Redis默认也无身份验证。(没有身份验证也是能够在高负载下表现优良的一个原因,当然如果别人知道了端口和ip,后果很严重,这也是目前redis最大的安全隐患,许多知名互联网项目目前都未进行身份验证)

 

          重要来了,差异点:

 

          1.Memcached将键名限制在250字节,值也被限制在不超过1MB,且只适用于普通字符串, Redis的键名和值都最大支持512M,MC这个坑估计许多人都遇到过。

          2.Memcached只支持字符串存储,几乎就限定了其应用场景就只是读数据,Redis支持字符串,哈希,列表,集合,有序集合,其应用场景瞬间扩大N倍,其丰富的内部函数和存储类型支持各种复杂操作,榜单场景处理中有自增自减函数,列表可以在队列处理场景中有入队,出队,集合函数有增加删除等等,有序集合还可以排序,计算。

          3.Memcached无数据持久性方案,只要重启,数据皆无,Redis还提供可选而且能够具体调整的数据持久性方案,RDB(快照)和AOF(复制)两种,管理员可以根据风险控制需要,通过在配置文件中设置,保持redis在一定时间周期持久化保持到磁盘上,当遇到即使重启,停电等情况,也能保持数据仍在,该特性对其在某些业务将redis作为持久存储方案有非常积极的意义。

          4.Redis还有一个非常重要的,远胜Memcached的特性,Memcached不支持主从,Redis能够提供复制功能,支持主从,复制功能可以帮助缓存体系实现高可用性配置方案,从而在遭遇故障的情况下继续为应用程序提供不间断的缓存服务,主从配置也是高并发下保证服务可靠性的标配。

          5.Memcached的数据回收机制使用的是LRU(即最低近期使用量)算法,Redis采用数据回收机制,能够将陈旧数据从内存中删除以提供新数据所必需的缓存空间。

          6.Memcached没有身份验证,Redis虽然默认无身份验证,但是它支持身份验证,虽然也几乎大家都没设置身份验证。

          7.Memcached的最大过期时间是一个月,否则会写入失败(这个坑我踩过),Redis还没有最大过期时间限制,但由于缓存机制两者不一样,在小于2.1.3的redis版本里,只能对key设置一次expire。redis2.1.3和之后的版本里,可以多次对key使用expire命令,更新key的expire time。

          8.Redis是单线程,Memcached是多线程,若数据结构仅为KEY-VALUE,且VALUE的值过大,最好用Memcached,因为单线程下GET过大数据,会引起阻塞,以及其他各种Redis的慢语句(如KEYS,HGETALL等)都最好不要在生产环境执行。

          9.Memcached的过期策略是惰性删除,Redis的过期策略是惰性删除+定期删除。

            (1)过期删除指下次GET到的值为过期则删除。

            (2)定期删除指每隔一段时间随机检查指定数量(默认为20)有过期时间的KEY,若过期则删除。

            当Memcached使用内存大于设置的最大内存使用时,为了腾出内存空间来存放新的数据项,Memcached会启动LRU算法(最近最少使用)淘汰旧的数据项。 

          所以通过以上分析,虽然Redis与Memcached都是作为两款非常优秀而且久经考验的缓存解决方案,各有优劣。

        10.Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。
            Memcache的存储涉及到slab,page,chunk三个概念
           1.Chunk为固定大小的内存空间,默认为48Byte。 
           2.page对应实际的物理空间,1个page为1M。
           3.同样大小的chunk又称为slab。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值