Redis 和 Memcached 的区别

JAVA herman 64浏览 0评论

人们就是一群奇怪的动物,总是拿来相互比较。于是就造成了,我们从小比吃穿,比学习,比成绩,比谁先结婚,比谁工作的好,比谁有房有车的坏习惯。一直衍生到写程序的世界,比各种框架、产品的优缺点。下面我们来看看近几年火热的 Redis!

说起 Redis,基本上是必谈 Memcached。它俩就是难兄难弟,经常被用来相互比较,相互伤害!很符合一些自然规律,总是成对的出现。正是基于此,我们一起来聊聊 Redis 和 Memcached 的区别。

为了说清楚它们之间的区别,我准备从以下几点下手:发布时间、数据类型、持久化、value大小、CPU 利用、数据一致性、内存管理等。

发布时间

Memcached 发布时间很早,从谷歌搜索的资料显示,大概 2007 年就存在来。但是有人根据百度百科上的 2012 年的时间来统计,这是不准确的。因为,Memcached 的发布要比 Redis 要早很多,而 Redis 的发布,百度百科上显示的是 2010 年。所以,从这以方便来说,也不要全部相信百度百科。

数据类型

两者都是支持 K/V 的存储结构的。但是 Redis 提供来更多数据类型的支持,比如:hash、list、set、sorted 等。Memcached 基本只支持简单的 key-value 存储,需要客户端自己处理复杂对象。

持久化

Redis 支持持久化,Memcached 不支持。这在灾难恢复等方面,Redis 占据绝对的优势。

Value 大小

Memcached 是一个内存缓存,key 的长度小于250字符,单个 item 存储要小于 1M。

Redis 网上没有明确的答案,从官网上来看 key 和 string 类型 value 均限制为不超过 512MB。

CPU 利用

Redis 是单进程单线程的,所以 CPU 利用不是很高。

Memcached 是单进程多线程的,所以 CPU 利用会好一些。

数据一致性

Redis 使用的是单线程模型,保证了数据按顺序提交。

Memcached 需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作。

内存管理

Memcached 使用预分配的内存池的方式,使用 slab 和大小不同的 chunk 来管理内存,Item 根据大小选择合适的 chunk 存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考 Memcached数据被踢(evictions>0)现象分析

Redis 使用现场申请内存的方式来存储数据,并且很少使用 free-list 等方式来优化内存分配,会在一定程度上存在内存碎片,Redis 跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致 swap 也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是 cache。

语言支持

两者现在支持的语言都比较多,基本上差别不大。

过期策略

Memcached 的过期数据不会立即从内存删除,而是读取的时候判断是否过期,过期则删除。这样避免类似一个守护进程去时时刻刻删除过期数据

Redis 读取的时候会判断是否过期,过期则删除。除此之外,redis 还会定期清理过期数据。

总结

Redis 中,并不是所有的数据都一直存储在内存中的,这是和 Memcached 相比一个最大的区别。

Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,hash 等数据结构的存储。

Redis 支持数据的备份,即 master-slave 模式的数据备份。

Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

当存储的数据不能被剔除时,使用 Redis 更合适。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763,QQ2群:454796847,QQ3群:187424846。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Redis 和 Memcached 的区别