要明白各自的使用场景,就要先知道他们的共同点和差异点。
共同点:
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。