频道栏目
首页 > 资讯 > SQL Server > 正文

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

18-06-12        来源:[db:作者]  
收藏   我要投稿

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

相关TAG标签
上一篇:kafka安装及基本使用教程
下一篇:云计算Hive词频统计实现方法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站