讲讲NoSQL比较火的三个数据库Memcached、Redis、MongoDB

算法研
• 阅读 10137

前言

NoSQL,泛指非关系型的数据库。随着互联网不断的发展,传统的关系数据库在应付新互联网模式的网站,特别是超大规模和高并发的SNS类型的纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。而今天主要讲用得比较多的三个NoSQL:Memcached、Redis、MongoDB。

Memcached

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

2.支持直接配置为session handle。

缺点
1.只支持简单的key/value数据结构,不像Redis可以支持丰富的数据类型。

2.无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。

3.无法进行数据同步,不能将MC中的数据迁移到其他MC实例中。

4.Memcached内存分配采用Slab Allocation机制管理内存,value大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题。需要用户注重value设计。

Redis

优点
1.支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)。

2.支持持久化操作,可以进行aof及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。

3.支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制,master-slave机制是Redis进行HA的重要手段。

4.单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。

5.支持pub/sub消息订阅机制,可以用来进行消息订阅与通知。

6.支持简单的事务需求,但业界使用场景很少,并不成熟。

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

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

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

MongoDB

优点
1.更高的写负载,MongoDB拥有更高的插入速度。

2.处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。

3.高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点(数据中心)故障转移。

4.快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置获取数据。MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度。

5.非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速。

缺点
1.不支持事务。

2.MongoDB占用空间过大 。

3.MongoDB没有成熟的维护工具。

Memcached、Redis、MongoDB的区别

1.性能
三者的性能都比较高,总的来讲:Memcached和Redis差不多,要高于MongoDB。

2.便利性
Memcached数据结构单一。

Redis丰富一些,数据操作方面,Redis更好一些,较少的网络IO次数。

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

3.存储空间
Memcached可以修改最大可用内存,采用LRU算法。

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

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

4.可用性
Memcached本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。

Redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡。

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

5.可靠性
Memcached不支持,通常用在做缓存,提升性能。

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

MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性。

6.一致性
Memcached在并发场景下,用cas保证一致性。

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

MongoDB不支持事务。
7.数据分析

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

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

Redis:数据量较小的高性能操作和运算上。

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

总结分析

1.若是简单的存取key-value(主要是读)这样的数据用Memcached好一些。若是要支持数据持久化,量也不大,操作很频繁,多数据类型(如集合、散列之类的),用列表类型做队列之类的高级应用,就用Redis,但如果是数据量比较大时就采用MongoDB。

2.Memcached的很多客户端更加成熟稳定,Redis协议比Memcached复杂。Redis不可能比Memcached快?但是测试结果基本是Redis占绝对优势。

3.云数据库Memcached版实例中的数据是存储在内存中的,当出现宕机、机房断电等意外,或是云数据库Memcached版实例在正常升级维护时,内存中的数据均会丢失。因此,云数据库Memcached版不能作为持久化的数据存储服务使用。Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据,实现持久化。

4.对于Redis和MongoDB来说,大家一般称之为Redis缓存、MongoDB数据库。Redis主要把数据存储在内存中,其“缓存”的性质远大于其“数据存储“的性质,其中数据的增删改查也只是像变量操作一样简单;MongoDB却是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样灵活。

5.MongoDB和Redis都是NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别,这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB建议集群部署,更多的考虑到集群方案,Redis更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。

相关资料

Nosql简介 Redis,Memchche,MongoDb的区别

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
redis 学习(常用命令及demo)
redisNOSQL介绍:是一项全新的数据库革命性运动,是一个非关系型数据库,在超大规模和高并发的SNS类型网站中应用广泛。NoSql是以keyvalue形式存储,特点是:非关系型、分布式、开源的水平可扩展。特点优势:处理超大量数据运行在便宜pc集群上击碎了性能瓶颈应用场景:1\
CuterCorley CuterCorley
4年前
Windows平台快速安装MongoDB和Robo 3T
一、简介1.数据库简介传统的数据库都是关系型数据库,包括MySQL、SQLServer等。但是随着业务需求的提高,传统数据库往往难以满足业务的需要,因此逐步出现了很多NoSQL数据库,包括MongoDB和Redis等,今天主要来介绍MongoDB和可视化工具Robo3T的安装。2.安装包下载MongoDB可以在官网下载,如下:Robo3
Wesley13 Wesley13
3年前
MongoDB是什么
MongoDB是什么?MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库。那么nosql又是什么?NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的we
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
MongoDB的安装与使用
1NoSQL简介NoSQL(NoSQLNotOnlySQL),意即"不仅仅是SQL";NoSQL是指非关系型的数据库,有时也称作NotOnlySQL的缩写,即"不仅仅是SQL",是对非传统关系型数据库管理系统的统称;NoSQL用于超大规模数据的存储(数据存储不需要固定的模式,无需多余操
Stella981 Stella981
3年前
Redis01——Redis介绍
1、NoSQL数据库概述  NoSQL(NoSQLNotOnlySQL),意即“不仅仅是SQL”,泛指非关系型的数据库。  NoSQL不依赖业务逻辑方式存储,而以简单的keyvalue模式存储。因此大大的增加了  数据库的扩展能力  特点:不遵循SQL标准,不支持ACID,远超于SQL的性能  适
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Redis数据库的安装与基本应用
一:了解NoSQL1:介绍:Nosql的全称是NotOnlySql,这个概念早起就有人提出,在09年的时候比较火。Nosql指的是非关系型数据库,而我们常用的都是关系型数据库。就像我们常用的mysql,sqlserver一样,这些数据库一般用来存储重要信息,应对普通的业务是没有问题的。但是,随着互联网的高速发展,传统的关系型数据库
Stella981 Stella981
3年前
ELK学习笔记之ElasticSearch的索引详解
0x00ElasticSearch的索引和MySQL的索引方式对比Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型