第一章、初识NoSQL
1.1 大数据时代
1.高并发读写需求
2.高效率存储和访问需求
3.高扩展性
1.2 认识NoSQL
Not Only SQL 解决大规模数据集合下数据种类多样性的挑战
1.2.2 NoSQL的特点
特点:
1、易扩展:数据表之间无关系
2、高性能:高并发读写性能,细粒度的cache
3、灵活的数据模型:方便添加字段
4、高可用
1.2.3 关系型和非关系型数据库的区别
1.存储方式
关系型数据库:表的格式存储,数据以行和列的方式存储,读取查询方便。
非关系型数据库:数据集的方法存储。
2.存储结构
关系型数据库:结构化的方式存储数据,每张数据表都要先定义结构,可靠/稳定,修改困难。
非关系型数据库:动态结构。
3.存储规范
关系型数据库:管理数据复杂。
非关系型数据库:平面数据集的方式存放,读写数据方便。
4.扩展方式
1.3 NoSQL 基础理论
1.3.1 CAP理论
一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)
分布式系统只能实现两个要素。
取舍策略 | 应用场景 |
---|---|
CA | Oracle、SQL Server、MySQL |
CP | MongoDB、HBase、Redis |
AP | DynamoDB |
1.3.2 BASE理论
1.3.3 最终一致性
1.4 NoSQL数据库分类
1.4.1 键值对存储数据库
key是查找每条数据的唯一标识符,value是存储的内容
Redis
用于会话存储和购物车
1.4.2 文档存储数据库
存储和管理文档,文档是结构化的数据(JSON、XML、BSON)
MongoDB
用于内容管理应用程序和电子商务应用程序
内容管理应用程序:博客和视频平台
1.4.3 列式存储数据库
HBase、Cassandra。
便于数据分析
1.4.4 图形存储数据库
第二章、文档存储数据库MongoDB
2.1 MongoDB概述
2.1.3 MongoDB的优势
- 支持多种存储引擎
WiredTiger存储引擎、内存存储引擎(In-Mermory)
3.2版本后默认为WiredTiger,4.x版本不再支持MMAPv1
2.2 MongoDB体系结构
文档(Document)、集合(Collection)、数据库(Database)组成
1.数据库
数据库存储集合和文档。一个数据库可创建多个集合,原则上将逻辑相近的集合放在一个数据库
2.集合
集合就是MongoDB的一组文档,分为一般集合和上限集合。
3.文档
文档以键值对的形式存储在集合中,键用于唯一标识一个文档,为字符串类型,值可以是各种复杂的文件类型,这种存储形式为BSON(BinaryJSON)。
每个文档都有默认的_id键,相当于主键,这个键的值必须在同一个集合中唯一,默认为ObjectId类型,用户如果不设置,会自动生成。
2.3 MongoDB数据类型
数据类型 | 相关说明 |
---|---|
Double | 双精度浮点型 |
String | 字符串,MongoDB仅支持UTF-8编码的字符串 |
Object | 对象类型 |
Array | 数组 |
Binary data | 二进制数据 |
ObjectId | 对象ID |
Boolean | 布尔 |
Data | 日期,以UNIX格式存储毫秒数,不存储时区 |
Null | 空 |
Regular Expression | 正则表达式 |
Code | 代码类型,存储js代码到文档 |
Int32 | 32位整数 |
Timestamp | 记录文档修改/添加的具体时间 |
Int64 | 64位整数 |
Decimal128 | 记录货币数据 |
Min key | |
Max key |
1.数字类型
{
"_id": ObjectId("5e042c88b"),
"age32": 32,
"age64": NumberLong(64),
"price": NumberDecimal(64.3)
}
2.日期类型
3.数组类型
{
"_id": ObjectId("5e042c88b"),
"hobby": [
"swim",
"run",
"sing",
4.0,
"sing"
]
}
4.ObjectId类型
ObjectId类型是一个12字节BSON类型。
ObjectId由4部分组成:
- Time:前4字节
- Machine:Time后的3个字节表示主机。
- PID:Machine后2个字节表示进程标识符。
- INC:PID后3个字节,随机值
MongoDB中存储的文档必须有一个_id键,采用ObjectId的原因是在多个服务器中同步自增主键非常耗费时间。
5.内嵌文档
文档中一个对象类型的字段在MongoDB中称为内嵌文档(Embedded),也是MongoDB推荐的存储格式。
{
"_id": ObjectId("5e042c88b"),
"size": {
"h": 8.5,
"w": 11.0
},
"reading": [
"John",
"Dave"
]
}
6.Code类型
2.4 MongoDB的使用规范
1.数据库使用规范
命名建议:
- 名称全部小写
- 不用数字开头
- db_xxxx
2.集合使用规范
命名建议:
- 名称全部小写
- 不用数字开头
- t_xxxx
- 使用“.”来分隔不同命名空间的子集合
第三章、MongoDB数据库操作
3.2 数据库操作
3.2.1 新建数据库
use DATABASE_NAME
3.2.2 查看数据库
# 查看所有数据库
show dbs
# 查看当前数据库
db
dbs:databases
3.2.3 删除数据库
db.dropDatabase()
db表示当前数据库对象,dropDatabase()删除当前数据库的方法
3.3 集合操作
3.3.1 创建集合
# 显式创建
db.createCollection(COLLECTION_NAME, [OPTIONS])
# 隐式创建
db.COLLECTION_NAME.insert(DOCUMENT)
# 查看集合
show collection
3.3.2 删除集合
db.COLLECTION_NAME.drop()
3.4 文档的插入、更新与删除操作
3.4.1 文档插入
分为单文档插入和多文档插入
# 单文档插入
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.save(document) #用不了
# 多文档插入
db.COLLECTION_NAME.insertMany([document1,document2,...])
insert()只插入
save()可以更新和写入
3.4.2 文档更新
db.COLLECTION_NAME.update(criteria, objNew, upsert, multi)
- criteria:更新的查询条件,类似where后的条件,主要用于匹配文档。
- objNew:表示更新的对象和一些更新的操作符,类型sql更新查询中set后的条件。
- upsert:可选参数。
- multi:默认为false,只更新找到的第一个文档;若为true,则将按条件查出来的多个文档都更新。可选参数。
db.comment.update({"content":"原内容"},{$set:{"content":"更改后的内容"}})
3.4.3 文档删除
# 删除单个文档
db.COLLECTION_NAME.remove(
<query>,
{
justOne:<boolean>,
writeConcern:<document>
}
)
# 删除所有文档
db.COLLECTION_NAME.remove({})
- : 可选参数,表示删除文档的条件。
- justOne:可选参数,为1或true时,只删除找到的第一个文档。
- writeConcern:表示抛出异常的级别
db.comment.remove({"nickname":"buzz"})
3.5 文档简单查询
3.5.1 查询所有文档
db.COLLECTION_NAME.find()
3.5.2 按条件查询文档
# 与 同时满足多个条件的文档
db.comment.find({$and:[{"userid":1005,"nickname":"buzz"}]})
# 或 满足其中一个条件
db.comment.find({$or:[{"userid":1005},{"userid":1006}]})
# 大于 大于1005的 $gt
db.comment.find({"userid":{$gt:1005}})
# 小于 $lt
db.comment.find({"userid":{$lt:1005}})
# 大于等于
db.comment.find({"userid":{$gte:1005}})
# 小于等于
db.comment.find({"userid":{$lte:1005}})
# 不等于$ne
db.comment.find({"userid":{$ne:1005}})
# 包含
db.comment.find({"_id":{$in:["1","3","5"]}})
# 不包含 nin
3.5.3 按特定类型查询文档
分为Null类型查询、正则表达式查询、嵌套文档查询和数组查询。嵌套文档查询包括精确匹配查询和点查询。
3.6 聚合操作
MongoDB的聚合操作包括聚合管道操作和Map-Reduce操作。
聚合管道操作:
3.6.1 聚合管道操作
使用不同的管道阶段操作器进行不同聚合操作。管道阶段操作器也称为管道操作符。
常见管道操作符 | 相关说明 |
---|---|
$group | 将集合中的文档进行分组,便于后续统计结果 |
$limit | 用于限制MongoDB聚合管道返回的文档数 |
$match | 用于过滤数据,只输出符合条件的文档 |
$sort | 将输入的文档先进行排序,再输出 |
$project | 用于修改输入文档的结构(增加、删除字段)和名称 |
$skip | 在聚合管道中跳过指定数量的文档,并返回剩余的文档 |
常见管道表达式 | 相关说明 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值的最小值 |
$max | 获取集合中所有文档对应值的最大值 |
$push | |
$first | |
$last |
3.6.2 Map-Reduce操作
3.7 使用索引优化查询
3.7.1 索引概述
3.7.2 索引操作
1.查看索引
db.COLLECTION_NAME.getIndexes()
2.查看索引大小
db.COLLECTION_NAME.totalIndexSize()
3.创建索引
db.COLLECTION_NAME.createIndexe(keys, options)
第四章 MongoDB副本集
4.1 副本集概述
4.2 副本集成员
主要三个成员,主节点(primary)、副本结点(secondary)、仲裁结点(arbiter)。
4.4 副本集操作
4.4.1 查看副本集成员状态
4.5 副本集机制
4.5.1 同步机制
副本结点默认以主结点作为同步源进行数据同步。
MongoDB使用两种形式完成数据同步过程,分别是完整同步和变化同步。
4.5.2 选举机制
如果主节点发生故障,导致无法使用,则其他拥有投票权的成员便会选举新的主结点。
4.5.3 心跳检测机制
第五章 MongoDB分片
5.1 分片概述
分片(sharding)技术,数据划分,放在不同机器。
可以降低单个机器的压力和处理更大的数据负载功能。
分片和副本集的区别:分片是每个结点存储数据的不同片段,而副本集是每个结点存储数据的相同副本。
5.2 分片策略
分片键(shard key):将集合中的数据划分为多个块(chunk)(默认大小为64MB),分片键可以是集合文档中的一个或多个字段。
1.范围分片(range sharding)
MongoDB根据分片键的值范围将数据划分为不同块,每个分片都包含了分片键在一定范围内的数据。
2.哈希分片(Hash sharding)
数据随机分布在分片集群中不同的分片服务器上。性能更差。
- 分片键
(1)分片键一旦指定,后续无法更改,且只能有一个分片键。
(2)不允许在已分片的集合文档上插入没有分片键的文档。
(3)分片键的长度大小,不可超过512个字节。
(4)用于作分片键的字段必须创建索引,索引可以是分片键开头的复合索引。
- 块(chunk)大小
(1)小块可以均匀地分布数据,但会导致迁移很频繁,会增大路由服务器的开销。
(2)大块触发的迁移较少,但会导致数据分布不均匀。
(3)块的大小会影响要迁移块的最大文档数。
(4)块的分片键值范围是(-∞,+∞)
5.3 分片集群架构
分片服务器(Shard)、路由服务器(Mongos)以及配置服务器(Config Server)组成。
1.分片服务器
即MongoDB实例(即mongod)。实际存储数据的组件,持有完整数据集中的一部分,从MongoDB 3.6开始,必须将分片部署为副本集,这样有更好的容错性。
2.路由服务器
即mongos,主要提供客户端应用程序与分片集群交互的接口,所有请求都需要通过路由服务器进行协调工作。实际上就是一个消息分发请求中心,它负责把客户端应用程序对应的数据请求转发到对应的分片服务器上,
应用程序将查询、存储、更新等请求发送给路由服务器。
3.配置服务器
即Config Server。存储分片集群的元数据,并且这些数据不允许丢失。
第六章 MongoDB GridFS
6.1 GridFS 概述
第七章 Redis
7.1 Redis 概述
7.1.3 Redis应用场景
缓存、构建队列系统、排行榜、实时反垃圾系统、过期数据自动处理、计数器应用等高并发场景。
7.2 数据结构
String、List、Set、Hash、Sorted Sets
1.String
值是二进制安全的,值数据类型可以是数字、文本、图片、视频或者序列化的对象等,值的最大长度不能超过512MB。
键(Key) | 值(Value) |
---|---|
Bookid | 100020 |
2.List
由若干个字符串元素组成的集合,每个字符串元素按照插入顺序排序。
在读写操作时只能从头部或尾部开始,不能从中间开始。
键(Key) | 值(Value) |
---|---|
LBookid | 100020 |
100021 | |
100022 | |
100022 |
List中允许重复元素。
3.Set
不重复且无序的字符串元素组成。
不重复:一个Set中所有元素都是唯一的,与List的区别;
无序:所有字符串的读写是针对任意位置的,与List的区别
键(Key) | 值(Value) |
---|---|
SBookid | 100021 |
100022 | |
100020 | |
100023 |
4.Hash
存储多个键值对之间的映射,属于无序的一个数据集合。
key必须为字符串。
value可以为字符串或数字,但value必须唯一。
Hash的key之间可以采用 : 符号隔开,增加用户的可读性,并为用户提供更多信息。
键(Key) | 值(Value) |
---|---|
Book:name | 《格局》 |
Book:id | 100021 |
Book:author | wujun |
Book:price | 45 |
5.Sorted Sets
有序集合:按照value自动排序。
key必须唯一;
value可以重复。
键(Key) | 值(Value) |
---|---|
Book:id04 | 100021 |
Book:id02 | 100022 |
Book:id03 | 100023 |
Book:id01 | 100023 |
7.4 redis-cli操作redis
redis自带命令行。
7.4.1 操作键
操作命令 | 相关说明 |
---|---|
SET | 为key设置value |
MSET | 为多个key设置value |
KEYS | 查找符合pattern的key |
GET | 获取key的value |
MGET | 获取多个key的对应value |
DUMP | 序列化key,返回被序列化的值 |
EXISTS | 判断key是否存在 |
TYPE | 查看key的类型 |
RENAME | 删除key的value |
EXPIRE | 设置key的生存时间,以秒计 |
TTL | 返回key的剩余生存时间 |
PRRSIST | 移除key的生存时间 |
DEL | 在key存在时,删除key |
1.SET命令
SET key value
2.MSET命令
MSET key1 value1 key2 value2 ... keyN valueN
3.KEYS命令
KEYS PATTERN
查找所有key:keys *
4.GET命令
GET key
5.MGET命令
MGET key1 key2
7.4.2 操作字符串
操作命令 | 相关说明 |
---|---|
SET | |
MSET | |
GET | |
MGET | |
GETSET | 获取旧value并设置新value |
STRLEN | 字节长度 |
GETRANGE | 获取指定索引范围的value内容 |
SETRANGE | 为key的指定索引位置设置value |
APPEND | 追加到末尾 |
7.4.3 操作列表
Redis为List提供的操作
操作命令 | 相关说明 |
---|---|
RPUSH | 右插入 |
LPUSH | 左插入 |
LRANGE | |
LINDEX | |
RPOP | 右弹出 |
LPOP | 左弹出 |
LLEN | 获取指定列表的长度 |
LREM | 移除指定元素 |
1.RPUSH命令
RPUSH
7.4.4 操作集合
set
操作命令 | 相关说明 |
---|---|
SADD | add 一个或多个 |
SCARD | 获取元素数量 |
SMEMBERS | 获取所有元素 |
sismember | |
SREM | 移除 |
SMOVE |
7.4.5 操作散列
Hash
操作命令 | 相关说明 |
---|---|
hset | |
hmset | |
hget | |
hmget | |
hgetall | |
hkeys | |
hvals | |
hdel |
7.4.6 操作有序集合
sorted sets
操作命令 | 相关说明 |
---|---|
zadd | |
zcard | |
zcount | |
zrange | |
zscore | |
zrem |
第八章 列式存储数据库HBase
基于Hadoop生态
第九章 图形存储数据库 Neo4j
9.4 Neo4j操作
9.4.1 Neo4j 的Cypher操作
Cypher是通过模式匹配Neo4j数据库中的结点和关系
操作命令 | 相关说明 |
---|---|
CREATE | 创建结点、关系 |
MATCH | 查找所有符合给定关系的结点、关系以及属性数据 |
RETURN | 返回查询结果 |
WHERE | 过滤条件 |
DELETE | 永久删除结点、关系 |
REMOVE | 删除结点的属性 |
Load csv with headers from 'file:///fortune1000.csv' as line
CREATE (p:Person {rank: line.rank, name: line.name, revenue: line.revenue}) return p