人们就是一群奇怪的动物,总是拿来相互比较。于是就造成了,我们从小比吃穿,比学习,比成绩,比谁先结婚,比谁工作的好,比谁有房有车的坏习惯。一直衍生到写程序的世界,比各种框架、产品的优缺点。下面我们来看看近几年火热的 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 更合适。
: » Redis 和 Memcached 的区别
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/251817.html