MySQL、Redis、MongoDB、Memcached对比

版权声明: https://blog.csdn.net/zhydream77/article/details/85275781

目录

 

特性:

特点:

使用场景:

 


特性:

mysql(关系型数据库)

主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,反复频繁的访问数据库。mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢.

第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;

第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。缓存的好处就是读取速度快。

Redis(内存数据库)

  是一个key-value存储系统(布式内缓存,高性能的key-value数据库)。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

MongoDB(NoSQL数据库)

   是一个介于关系数据库和非关系数据库之间的产品(基于分布式文件存储的数据库),是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

Memcached(内存Cache)

  是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数。为了加快文件访问速度且提供多个使用者、需要在内存中建立内存缓存数据的管理减小读写磁盘的次数及保证数据的更新、因为需要使用cache缓存。

特点:


1-1 MySQL:
1. 使用c和c++编写,并使用了多种编译器进行测试,保证源代码的可移植性
2. 支持多种操作系统
3. 为多种编程语言提供可API
4. 支持多线程,充分利用CPU资源
优化的SQL查询算法,有效的提高查询速度
5. 提供多语言支持,常见的编码如:GB2312、BIG5、UTF8
6. 提供TCP/IP、ODBC和JDBC等多种数据库连接途径
提供用于管理、检查、优化数据库操作的管理工具
7. 大型的数据库。可以处理拥有上千万条记录的大型数据库
8.支持多种存储引擎
9. MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库
10. MySQL使用标准的SQL数据语言形式
11. Mysql是可以定制的,采用GPL协议,你可以修改源码来开发自己的MySQL系统
12. 在线DDL更改功能
13. 复制全局事务标识
14. 复制无崩溃从机
15.复制多线程从机


1-2. Redis:
1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,在set,hash等数据结构的存储。
3. Redis支持数据的备份,即master-slave模式的数据备份
4. 性能极高- Redis能读的速度是110000次/s,写的速度是81000次/s
5. 丰富的数据类型-Redis支持二进制案例的Strings,Lists,Hashes,Setes及Ordered Sets数据类型操作。
6. 原子 - Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
7. 丰富的特性 - Redis还支持publish/subscribe,通知,key过期等等特性。 

8.支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算);
9.支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段;
10.支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制, master-slave机制是Redis进行HA的重要手段;
11.单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题;
12.支持pub/sub消息订阅机制,可以用来进行消息订阅与通知;
13.支持简单的事务需求,但业界使用场景很少,并不成熟。

14.Redis只能使用单线程,性能受限于CPU性能,故单实例CPU最高才可能达到5-6wQPS每秒(取决于数据结构,数据大小以及服务器硬件性能,日常环境中QPS高峰大约在1-2w左右);

15.支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点;

16.支持(快照、AOF):依赖快照进行持久化,AOF增强了可靠性的同时,对性能有所影响;

 17.Redis在string类型上会消耗较多内存,可以使用dict(hash表)压缩存储以降低内存耗用;

  18.MC和Redis都是Key-Value类型,不适合在不同数据集之间建立关系,也不适合进行查询搜索。比如redis的keys pattern这种匹配操作,对redis的性能是灾难;

 19.Redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache);

 20.Redis事务支持比较弱,只能保证事务中的每个操作连续执行,


1-3. MongoDB:
1. 模式自由:可以把不同结构的文档存储在同一个数据库里
2. 面向集合的存储:适合存储JSON风格文件的形式
3. 完整的索引支持,对任何属性可索引
4. 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目的是提供冗余及自动故障转移
5. 自动分片:支持水平的数据库集群,可动态添加额外的机器
6.丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式额标记,可轻易查询文档中的内嵌的对象及数组
7. 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
8.高效的传统存储方式:支持二进制数据及大型对象

9.适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起;

10.支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富;

11.支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制;

12.从1.8版本开始采用binlog方式支持持久化的可靠性;

13.MongoDB不支持事务;

14.MongoDB内置了数据分析的功能(mapreduce),其他不支持

15.从1.8版本开始采用binlog方式支持持久化的可靠性;

1.4 Memcached

  1.可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量;
  2.支持直接配置为session handle.

        3.只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型;
  4.无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失;
  5.无法进行数据同步,不能将MC中的数据迁移到其他MC实例中;
  6.内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。

  7.Memcached可以修改最大可用内存,采用LRU算法。

使用场景


使用场景的不同: 
MongoDB应用场景:
①网站数据:适合实时的插入,更新与查询,并具备网站实时数据存储所需对的复制及高度伸缩性;
②缓存:由于性能很高,也适合作为信息基础设施的缓存层,在系统重启之后,搭建的持久化缓存可以避免下层的数据源过载;
③大尺寸、低价值的数据也是MongoDB的最佳选择,使用传统的关系数据库存储一些数据时可能会比较贵,再次之前很多程序员往往会选择传统的文件进行存储
④高伸缩的场景,非常是个由数十或者数百台服务器组成的数据库
⑤用于对象及json数据的存储,MongoDB的bson数据格式非常适合文档格式化的存储及查询。


mysql应用场景:
①高度事务性的系统。例如银行或者会计系统,传统的关系型数据库目前还是更实用于需要大量原子性复杂事务的应用程序
②传统的商业智能应用,针对特定问题的BI数据库会对产生高度优化的查询方式,对于此类应用,数据仓库可能是更合适的选择

主要解决海量数据的访问效率问题。

Redis应用场景:
1. 用来做缓存-redis的所有数据时放在内存中的
2. 可以在某些特定应用场景下替代传统数据库--比如社交类的应用
3. 在一些大型系统中,巧妙的实现一些特定的功能:session共享、购物车

4.适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)

Memcached应用场景: 

 1.动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等);

 2.用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)。

 

猜你喜欢

转载自blog.csdn.net/zhydream77/article/details/85275781