Redis(内存数据库)
是一个key-value存储系统(高性能的key-value数据库)。和Memcached类似,它支持的value类型相对更多,包括String(字符串)、List(链表)、Set(集合)、Zset(sorted set有序集合)和Hash(哈希类型)。这些数据类型都支持push/pop、add/remove、取交集并集和差集以及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis还支持不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
MongoDB(NOSQL数据库)
是一个介于关系数据库和非关系数据库之间的产品(基于分布式文件存储的数据库),是非关系数据库中功能最丰富,最像关系型数据库的。他支持的数据结构非常松散,是类似于json的bson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点就是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
Memcached(内存Cache)
是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储 键/值 对的hashmap。其守护进程(daemon)是用C写的,但客户端可以用任何语言来编写,并通过Memcached协议与守护进程进行通信。
特点
Redis:
优点
(1)、支持多种数据结构,如string(字符串)、list(链表)、dict(hash表)、set(集合)、zset(排序set);
(2)、支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份及数据恢复等操作,较好的防止数据丢失;
(3)、支持通过replication进行数据复制,通过master-slave机制,可以实时的进行数据的同步复制,支持多级复制和增量复制,master-slave及时是redis进行HA的重要手段;
(4)、单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
(5)、支持pub/sub消息订阅机制,可以用来进行消息订阅与通知;
(6)、支持简单的事务需求,但业界使用场景很少,并不成熟。
缺点
(1)、redis只能使用单线程,性能受限于CPU性能;
(2)、支持简单的事务需求,但是业界使用场景很少,并不成熟,既是优点也是缺点;
(3)、支持(快照、AOF),依赖快照进行持久化,AOF增强了可靠性的同时,对性能有所影响;
(4)、redis在string类型上会消耗较多的内存,可以使用dict(hash表)压缩存储来降低内存耗用;
(5)、MC和redis都是key-value类型,不适合在数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难;
(6)、redis在2.0版本后增加了自己的VM特性,突破物理内存的限制,可以对key value设置过期时间;
(7)、redis对事务的支持比较弱,只能保证事务中的每个操作连续执行。
MongoDB:
优点
(1)、适合大数据量的存储,依赖操作系统的VM做内存管理,吃内存也比较厉害,服务不要和别的服务放在一起;
(2)、支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富;
(3)、支持master-slave;
(4)、从1.8版本开始采用binlog方式支持持久化的可靠性;
(5)、MongoDB内置了数据分析的功能(mapreduce),其他不支持。
缺点
(1)、MongoDB不支持事务;
Memcached:
优点
(1)、可以利用多核优势,单实例吞吐量极高;
(2)、支持直接配置为session handle;
(3)、memcached可以修改最大可用内存,采用LRU算法。
缺点
(1)、只支持简单的key/value数据结构,不像redis可以支持丰富的数据类型;
(2)、无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失;
(3)、无法进行数据同步,不能MC中的数据迁移到其他MC实例中;
(4)、内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题,需要用户注重value设计。
使用场景
Redis
适用于对读写效率要求都很高,数据处理业务复杂和对安全性要切较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)
MongoDB
主要解决海量数据的访问效率问题。
Memcached
动态系统中减轻数据库负载,提升性能;
做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等);