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