欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关系型数据库SQL及NoSQL学习讲解

程序员文章站 2022-07-06 12:11:27
#关系型sql + 关系型数据库实现了关系模型,并用它来处理数据。关系模型在表中将信息与字段关联起来(也就是schemas),从而存储数据。这种数据库管理系统需要结构(例如表)在存储数据之前被定义出...

#关系型sql

+ 关系型数据库实现了关系模型,并用它来处理数据。关系模型在表中将信息与字段关联起来(也就是schemas),从而存储数据。这种数据库管理系统需要结构(例如表)在存储数据之前被定义出来。有了表,每一列(字段)都存储一个不同类型(数据类型)的信息。数据库中的每个记录,都有自己唯一的key,作为属于某一表的一行,行中的每一个信息都对应了表中的一列——所有的关系一起,构成了关系模型。

+ sql主要有3个标准:ansi sql、sql92、sql99

+ 主要的数据库访问接口:odbc、jdbc、ado.net、pdo

+ 关系数据库选型原则:教学用sqlserver,自己玩用mysql,想玩高端大气就db2,想花钱买放心家省心就用oracle

+ mysql、oracle、db2都是可以在当下几乎所有主流平台上使用的;而sql server只能在windows平台,没有丝毫的开放性;sql server没有获得任何的安全认证;oracle、db2都获得了*别的iso标准认证;sql server在多用户时性能不佳、db2适用于数据仓库和在线事物处理性能较高、oracle性能最高;sql server操作简便,但只有gui;oracle操作比较复杂,同时有gui与命令行操作,windows.nt及unix下一样;db2及mysql操作比较简单,同时有gui与命令行,windows.nt及unix下一样;

##sqlite

sqlite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 sql 数据库引擎。sqlite 源代码不受版权限制。sqlite 直接访问其存储文件。sqlite 是非常小的,是轻量级的,完全配置时小于 400kib,省略可选功能配置时小于250kib。sqlite 支持 sql92(sql2)标准的大多数查询语言的功能。sqlite 使用 ansi-c 编写的,并提供了简单和易于使用的 api。

###sqlite语法

+ 所有的点命令只在 sqlite 提示符中可用。

+ sqlite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 glob 和 glob 在 sqlite 的语句中有不同的含义。

+ sql 注释以两个连续的 "-" 字符(ascii 0x2d)开始,并扩展至下一个换行符(ascii 0x0a)或直到输入结束,以先到者为准。

+ 所有的sqlite 语句可以以任何关键字开始,如 select、insert、update、delete、alter、drop 等,所有的语句以分号(;)结束。

+ 每个存储在 sqlite 数据库中的值都具有以下存储类之一:null、integer、real、text和blob;sqlite 没有单独的 boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。

+ 创建数据库命令,sqlite3 命令被用来创建新的 sqlite 数据库。您不需要任何特殊的权限即可创建一个数据:sqlite3 databasename.db;

使用.databases命令可以查看当前有哪些数据库,使用.quit可以退出; 使用.dump 命令来导出完整的数据库在一个文本文件(ascii)中:sqlite3 xxx.db .dump > xxx.sql;可以通过简单的方式从生成的 testdb.sql 恢复sqlite3 xxx.db < xxx.sql

+ sqlite 的 attach database 语句是用来选择一个特定的数据库,使用该命令后,所有的 sqlite 语句将在附加的数据库下执行。sqlite的 detach dtabase 语句是用来把命名数据库从一个数据库连接分离和游离出来,连接是之前使用 attach 语句附加的。如果同一个数据库文件已经被附加上多个别名,detach 命令将只断开给定名称的连接,而其余的仍然有效。

+ sqlite 的 create table 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。可以使用 sqlite 命令中的 .tables 命令来验证表是否已成功创建,该命令用于列出附加数据库中的所有表。可以使用 sqlite .schema 命令得到表的完整信息

+ sqlite 的 drop table 语句用来删除表定义及其所有相关数据、索引、触发器、约束和该表的权限规范。

+ sqlite 的 insert into 语句用于向数据库的某个表中添加新的数据行。可以通过在一个有一组字段的表上使用 select 语句,填充数据到另一个表中。

+ sqlite 的 select 语句用于从 sqlite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。.header on .mode column可以让数据整齐显示在窗口中。

+ sqlite运算符主要用在where子句中,算术运算符:+ - * / %,比较运算符== != > < = ,逻辑运算符 and between exists in like glob not or is null || unique ,位运算符& | ~ << >>;

+ sqlite的 where 子句用于指定从一个表或多个表中获取数据的条件。如果满足给定的条件,即为真(true)时,则从表中返回特定的值。

您可以使用 where 子句来过滤记录,只获取需要的记录。where 子句不仅可用在 select 语句中,它也可用在 update、delete 语句中,等等。

+ sqlite 的 update 查询用于修改表中已有的记录。可以使用带有 where 子句的 update 查询来更新选定行,否则所有的行都会被更新。

+ sqlite 的 delete 查询用于删除表中已有的记录。可以使用带有 where 子句的 delete 查询来删除选定行,否则所有的记录都会被删除。

+ sqlite 的 like 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,like 运算符将返回真(true),也就是 1。

+ sqlite 的 glob 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,glob 运算符将返回真(true),也就是 1。

+ sqlite 的 limit 子句用于限制由 select 语句返回的数据数量。

+ sqlite 的 order by 子句是用来基于一个或多个列按升序或降序顺序排列数据。

+ sqlite 的 group by 子句用于与 select 语句一起使用,来对相同的数据进行分组。在 select 语句中,group by 子句放在 where 子句之后,放在 order by 子句之前。

+ having 子句允许指定条件来过滤将出现在最终结果中的分组结果。where 子句在所选列上设置条件,而 having 子句则在由 group by 子句创建的分组上设置条件。

###使用问题集锦

+ 如果直接在sqlite里面建数据库就会出现下面的情况:near "sqlite3":syntax error,会出现这种情况的原因是因为sqlite已经表示数据库了,相当于是在数据库里建数据库。如果你想创建一个数据库的话直接在某个目录下输入创建命令,而不是先输入sqlite,再输入创建命令。

##mysql

mysql 在所有大型数据库服务器中最流行的一个. 它的特性丰富,产品的开源性质使得其驱动了线上大量的网站和应用程序. 要入手 mysql 相对简单,开发人员可以在互联网上面访问到大量有关这个数据库的信息.由于这个产品的普及性,大量的第三方应用、工具和集成库对于操作这个rdbcms的方方面面大有帮助.mysql没有尝试去实现sql标准的全部,而是为用户提供了很多有用的功能. 作为一个独立的数据库服务器,应用程序同mysql守护进程的交互,告诉它去访问数据库自身 -- 这一点不像 sqlite.

+ mysql是小型的关系数据库管理系统,必须启用mysqld进程(计算机-管理-服务和应用程序)后客户端才能连接访问,通过在cmd命令中输入net start xxx和net stop xxx也能启动和停止服务器进程;在启动菜单打开mysql command line client打开客户端登录窗口,输入密码进行登录,或者在cmd命令窗口中(已配置环境变量前提下)输入mysql -h localhost -u root -p,然后回车输入密码登录;mysql图形化管理工具有mysql workbench、phpmyadmin、navicat等;

+ 查看当前存在的数据库:show databases;其中有几个是系统默认创建的数据库;创建数据库是在磁盘上划分一块区域用于数据的存储和管理;

创建数据库命令:create database database_name;

查看数据库定义:show create database database_name;

删除数据库:drop database database_name;

+ 数据库存储引擎是数据库底层软件,dbms使用数据库存储引擎进行创建、查询、更新和删除操作,mysql5.7支持的存储引擎有innodb、myisam、memory、archive、csv等,用show engines查看支持的引擎,innodb是事务型数据库的首选引擎,支持acid,支持行锁定和外键,为处理大数据量的最大性能设计,myisam是在web、数据存储和其它环境下最常用的存储引擎之一,插入和查询速度快,不支持事务。

+ use xxx;选择一个数据库

+ 创建数据表:

create table <表名> (字段名1,数据类型 [列级别约束条件] [默认值],

字段名2,数据类型 [列级别约束条件] [默认值],

...

表级别约束条件)

show tables查看创建的表

单字段主键和多字段主键 primary key;外键在两个表之间建立连接,外键必须是另一个表中的主键,可以不是本表的主键 foreign key;子表的外键为父表的主键;非空约束not null;唯一性约束unique;默认值约束default;属性自动增加 auto_increment;

+ 查看表基本结构 describe table_name;

+ 修改表名 alter table <旧表名> rename [to] <新表名>;

修改数据字段类型 alter table <表名> modify <字段名> <数据类型>;

修改字段名 alter table <表名> change <新表名> <新数据类型>;

添加字段 alter table <表名> add <新字段名> <数据类型>;

删除字段 alter table <表名> drop <字段名>;

修改字段排列顺序 alter table <表名> modify <字段1> <数据类型> first|after <字段2>;

修改表存储引擎 alter table <表名> engine=<更改后的存储引擎名>

删除数据表 drop table 表1,表2,表3...

数据表之间存在关联的情况下直接删除父表会失败,要先删除与它关联的子表,如果要单独删除父表要将关联的表的外键约束取消才能删除;

+ mysql支持的数据类型:

数值数据类型 整数类型tinyint smallint mediumint int bigint 浮点类型float double 定点小数 decimal

日期/时间类型 year time date datetime timestamp

字符串类型 char varchar binary varbinary blob text enum set

+ 常见运算符 算术、比较、逻辑、位操作

+ mysql函数 数学函数、字符串函数 日期/时间函数 条件判断函数 系统信息函数 加/解密函数

+ 数据查询命令

select {*|<字段列表>}

[from <表1>,<表2>...

[where <表达式>

[group by ]

[having [{}...]]

[order by ]

[limit [,]]

]

select [字段1,字段2,...] from [表或视图] where [查询条件]

in、between and、like、and、or条件应用

聚合函数 count sum avg max min

内连接查询、外连接查询、复合条件查询

子查询、合并查询结果union、使用正则表达式查询

+ 插入更新删除数据

插入数据 insert into table_name (colunmn_list) values (value_list1),(value_listw).;

将查询结果插入表中

更新数据 update table_name set column_name1 = value1,colunmn_name2=value2.... where condition

删除数据 delete from table_name [where ]

+ 使用索引加快速度

+ 存储过程 一条后多条sql语句的集合

+ 视图是虚拟表

+ 触发器

##postgresql

postgresql 是一个先进的,开放源代码的[对象]-关系型数据库管理系统,它的主要目标是实现标准和可扩展性. postgresql试图把对 ansi/iso sql标准的采用与修正结合起来。

postgresql服务器可以处理来自客户端的多个并发请求。 因此,它为每个连接启动("forks")一个新的进程。 从这个时候开始,客户端和新服务器进程就不再经过最初的 postgres进程的干涉进行通讯。 因此,主服务器进程总是在运行并等待着客户端联接, 而客户端和相关联的服务器进程则是起起停停(当然,这些对用户是透明的。我们介绍这些主要是为了内容的完整性)。

新手教程连接:https://jingyan.baidu.com/article/3ea51489ec3cb452e71bba52.html

+ 基本管理命令

\h:查看sql命令的解释,比如\h select。

\:查看psql命令列表。

\l:列出所有数据库。

\c [database_name]:连接其他数据库。

\d:列出当前数据库的所有表格。

\d [table_name]:列出某一张表格的结构。

\du:列出所有用户。

\e:打开文本编辑器。

\conninfo:列出当前数据库和连接的信息。

\q:退出

+ 基本操作

基本的数据库操作,就是使用一般的sql语言。

创建/删除数据库 create/drop database db_name;

# 创建新表

create table usertbl(name varchar(20), signupdate date);

# 插入数据

insert into usertbl(name, signupdate) values('张三', '2013-12-22');

# 选择记录

select * from user_tbl;

# 更新数据

update user_tbl set name = '李四' where name = '张三';

# 删除记录

delete from user_tbl where name = '李四' ;

# 添加栏位

alter table user_tbl add email varchar(40);

# 更新结构

alter table usertbl alter column signupdate set not null;

# 更名栏位

alter table usertbl rename column signupdate to signup;

# 删除栏位

alter table user_tbl drop column email;

# 表格更名

alter table usertbl rename to backuptbl;

# 删除表格

drop table if exists backup_tbl;

##比较

sqlite优点:基于文件、标准化、开发测试方便

sqlite缺点:没有用户管理、缺乏额外优化性能的灵活性

sqlite使用:嵌入式应用、代替磁盘访问、测试

sqlite不使用:多用户应用、需要大面积写入数据的应用

mysql优点:容易使用、功能丰富、安全、灵活而强大、快速

mysql缺点:已知局限、可靠性、开发停滞

mysql使用:分布式操作、高安全性、web网站和web应用、定制解决方案

mysql不使用:sql服从性、并发、缺乏特色

postgresql优点:标准支持sql的开源关系型数据库、强大的社区、强大的第三方库、可扩展性、面向对象

postgresql缺点:性能、普及、托管

postgresql使用:数据完整性、复杂的自定义过程、整合、复杂的设计

postgresql不使用:速度、简化*、复制

#非关系型数据库nosql

nosql,指的是非关系型的数据库。nosql有时也称作not only sql的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。nosql用于超大规模数据的存储。(例如谷歌或facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

rdbms

- 高度组织化结构化数据

- 结构化查询语言(sql) (sql)

- 数据和关系都存储在单独的表中。

- 数据操纵语言,数据定义语言

- 严格的一致性

- 基础事务

nosql

- 代表着不仅仅是sql

- 没有声明性查询语言

- 没有预定义的模式

-键 - 值对存储,列存储,文档存储,图形数据库

- 最终一致性,而非acid属性

- 非结构化和不可预知的数据

- cap定理

- 高性能,高可用性和可伸缩性

在计算机科学中, cap定理(cap theorem), 又被称作 布鲁尔定理(brewer's theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

一致性(consistency) (所有节点在同一时间具有相同的数据)

可用性(availability) (保证每个请求不管成功或者失败都有响应)

分隔容忍(partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

cap理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 cap 原理将 nosql 数据库分成了满足 ca 原则、满足 cp 原则和满足 ap 原则三 大类:

ca - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。

cp - 满足一致性,分区容忍性的系统,通常性能不是特别高。

ap - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

base是nosql数据库通常对可用性及一致性的弱要求原则:

basically availble --基本可用

soft-state --软状态/柔性事务。 "soft state" 可以理解为"无连接"的, 而 "hard state" 是"面向连接"的

eventual consistency -- 最终一致性, 也是是 acid 的最终目的。

##mongodb

mongodb是一种文档性的数据库,即可以存放xml、json、bson类型系数据。这些数据具备自述性(self-describing),呈现分层的树状数据结构。redis可以用hash存放简单关系型数据。mongodb存放json格式数据。

mongodb 旨在为web应用提供可扩展的高性能数据存储解决方案。

+ 在mongodb2.2版本后已经不再支持windowsxp系统。最新版本也已经没有了32位系统的安装文件。32位系统上mongodb的数据库最大为2gb。

+ 适合场景:事件记录、内容管理或者博客平台,比如评论系统。

+ mongodb持久化原理

mongodb与mysql不同,mysql的每一次更新操作都会直接写入硬盘,但是mongo不会,做为内存型数据库,数据操作会先写入内存,然后再会持久化到硬盘中去,那么mongo是如何持久化的呢

mongodb在启动时,专门初始化一个线程不断循环(除非应用crash掉),用于在一定时间周期内来从defer队列中获取要持久化的数据并写入到磁盘的journal(日志)和mongofile(数据)处,当然因为它不是在用户添加记录时就写到磁盘上,所以按mongodb开发者说,它不会造成性能上的损耗,因为看过代码发现,当进行cud操作时,记录(record类型)都被放入到defer队列中以供延时批量(groupcommit)提交写入,但相信其中时间周期参数是个要认真考量的参数,系统为90毫秒,如果该值更低的话,可能会造成频繁磁盘操作,过高又会造成系统宕机时数据丢失过。

+ 通过mongod.exe --dbpath pathname命令来指定mongodb的数据目录,在win7 32位系统上执行上述命令时报错:‘exception in initandlisten: 28663 cannot start server...’,根据提示输入:mongod --dbpath=d:software\mongodb\data --storageengine=mmapv1 执行成功

+ 另起一个cmd窗口运行mongo.exe,连接成功

+ 通过mkidr db mkdir log创建数据库和日志目录

+ show dbs 查看所有数据库 db 查看当前文档 use xxx连接到指定数据库

+ sql术语/概念 mongodb术语/概念 解释/说明

database database 数据库

table collection 数据库表/集合

row document 数据记录行/文档

column field 数据字段/域

index index 索引

table joins 表连接,mongodb不支持

primary key primary key 主键,mongodb自动将_id字段设置为主键

+ mongodb数据类型

string 字符串。存储数据常用的数据类型。在 mongodb 中,utf-8 编码的字符串才是合法的。

integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。

boolean 布尔值。用于存储布尔值(真/假)。

double 双精度浮点值。用于存储浮点值。

min/max keys 将一个值与 bson(二进制的 json)元素的最低值和最高值相对比。

array 用于将数组或列表或多个值存储为一个键。

timestamp 时间戳。记录文档修改或添加的具体时间。

object 用于内嵌文档。

null 用于创建空值。

symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。

date 日期时间。用 unix 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 date 对象,传入年月日信息。

object id 对象id。用于创建文档的id。

binary data 二进制数据。用于存储二进制数据。

code 代码类型。用于在文档中存储 javascript 代码。

regular expression 正则表达式类型。用于存储正则表达式。

+ mongodb连接服务器 mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostn[:portn]]][/[database][options]]

+ use database_name 创建数据库 db.dropdatabase() 删除数据库 db.createcollection(name,options)创建集合 show collections

db.collection.drop() 删除集合 db.collection.insert() 插入文档

##redis

redis是一个开源的使用ansi c语言编写、遵守bsd协议、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的api。

redis的优点:

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

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

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

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

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

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

redis的局限性:

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

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

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

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

+ 解压32位win32,进入cmd窗口在目录下运行 redis-server.exe redis.windows.conf,显示版本信息界面即可用,这个窗口不要关闭,不然服务端就无法访问了;另起一个cmd窗口,切换到解压目录下运行redis-cli.exe -h 127.0.0.1 -p 6379,即可连接到服务端(redis-cli -h host -p port -a password);

+ 客户端执行config get * 获取所有配置项,config get xxx 获取配置内容,config set name value 设置配置项值

+ redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象,string类型是redis最基本的数据类型,一个键最大能存储512mb;redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象;redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边);redis的set是string类型的无序集合;redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序;

+ redis键命令用于管理redis的键,redis在2.8.9版本添加了hyperloglog结构,用来做基数统计的算法

+ redis save 命令用于创建当前数据库的备份,

##memcache

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

支持直接配置为session handle。

memcached的局限性:

只支持简单的key/value数据结构,不像redis可以支持丰富的数据类型。

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

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

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

##对比

1、性能

都比较高,性能对我们来说应该都不是瓶颈,总体来讲,tps方面redis和memcache差不多,要大于mongodb。

2、操作的便利性

memcache数据结构单一

redis丰富一些,数据操作方面,redis更好一些,较少的网络io次数

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

3、内存空间的大小和数据量的大小

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

memcache可以修改最大可用内存,采用lru算法

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

4、可用性(单点问题)

对于单点问题,

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

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

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

5、可靠性(持久化)

对于数据持久化和数据恢复,

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

memcache不支持,通常用在做缓存,提升性能;

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

6、数据一致性(事务支持)

memcache在并发场景下,用cas保证一致性

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

mongodb不支持事务

7、数据分析

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

8、应用场景

redis:数据量较小的性能操作和运算上

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

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

总的来说 redis/memcache 是基于内存的,讲究的是性能,多用作缓存层,比如说存放session。而 mongodb是面向文档的,存储的是类似json的非结构化数据,查询起来非常方便,开发效率高,比较类似传统sql关系型数据库。

普遍认为redis性能明显好于memorycache。