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

#关系型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。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐