
MongoDB 更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,支持多种类型的数据结构,可用作数据库,高速缓存和消息队列代理。
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,具有以下的特点,协议简单,基于libevent的事件处理,内置内存存储方式,memcached不互相通信的分布式
一、内存管理机制Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。
MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
Memcache 数据全部存在内存,默认使用SlabAllocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。
二、支持的数据结构Redis 支持的数据结构丰富,包括hash、set、list等。
MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
Memcache数据结构单一
三、数据量和性能Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 ,
当物理内存够用的时候,Redis>MongoDB>MySQL
当物理内存不够用的时候,Redis和MongoDB都会使用虚拟内存。
实际上如果Redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。
但是,MongoDB不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。
MongoDB还是能够保证性能。
四、性能都比较高,性能对我们来说应该都不是瓶颈
总体来讲,TPS方面Redis和Memcache差不多,要大于MongoDB
五、可靠性MongoDB从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性;
Redis依赖快照进行持久化,AOF增强可靠性,增强可靠性的同时,影响访问性能。
Memcache不支持数据持久化,通常用在做缓存,提升性能;
可靠性上MongoDB优于Redis,Memcache。
六、数据分析MongoDB内置数据分析功能(mapreduce);
Redis,Memcache不支持。
七、事务支持情况Redis 事务支持比较弱,只能保证事务中的每个操作连续执行;
MongoDB不支持事务。
Memcache 在并发场景下,用cas保证一致性
八、集群MongoDB 集群技术比较成熟,
Redis从3.0开始支持集群。
Memcached虽然能够通过分布式缓存,实现其中Memcached宕掉不会丢失全部缓存数据,但部分数据还是难逃一劫。 我们可以利用Magent代理Memcached实现主从备份来保证缓存数据完好无损,而且Magent还可以作为从继续使用,单大体工作原理如下:
1、Magent每次写数据都会写到主Memcached和从Memcached上,并且向主从Memcached写的算法一样;
2、当主Memcached宕掉,Magent会向从Memcached中读取数据。
3、当主Memcached恢复后,Magent将重新向主Memcached中读取数据;此时由于主Memcached刚刚恢复,其中并无数据,因此导致部分数据无法读取,这也是Magent的一大缺点。
参考:PHP中文网、CSDN、博客园、知乎等
评论(1)