NoSQL笔记

第一章、初识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)

分布式系统只能实现两个要素。

取舍策略应用场景
CAOracle、SQL Server、MySQL
CPMongoDB、HBase、Redis
APDynamoDB

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代码到文档
Int3232位整数
Timestamp记录文档修改/添加的具体时间
Int6464位整数
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)
Bookid100020

2.List

由若干个字符串元素组成的集合,每个字符串元素按照插入顺序排序。

在读写操作时只能从头部或尾部开始,不能从中间开始。

键(Key)值(Value)
LBookid100020
100021
100022
100022

List中允许重复元素。

3.Set

不重复且无序的字符串元素组成。

不重复:一个Set中所有元素都是唯一的,与List的区别;

无序:所有字符串的读写是针对任意位置的,与List的区别

键(Key)值(Value)
SBookid100021
100022
100020
100023

4.Hash

存储多个键值对之间的映射,属于无序的一个数据集合。

key必须为字符串。

value可以为字符串或数字,但value必须唯一。

Hash的key之间可以采用 : 符号隔开,增加用户的可读性,并为用户提供更多信息。

键(Key)值(Value)
Book:name《格局》
Book:id100021
Book:authorwujun
Book:price45

5.Sorted Sets

有序集合:按照value自动排序。

key必须唯一;

value可以重复。

键(Key)值(Value)
Book:id04100021
Book:id02100022
Book:id03100023
Book:id01100023

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

操作命令相关说明
SADDadd 一个或多个
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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值