Nosql数据库知识点汇总
第一章 初识Mongodb
1.1【掌握】大数据的时代对数据存储的挑战
-
高并发读写需求
-
高效率存储和访问需求
-
高扩展性
1.2【掌握】Nosql简介、特点、与传统数据库的区别
1.2.1 Nosql简介
-
出现:1988年
-
非关系型数据库,主要是强调键值存储和文档存储数据库的优点,而不是单纯的反对关系型数据库
-
Nosql是 Not Only SQL 的缩写
-
Nosql的出现是主要是解决大规模数据集合下数据种类多样性带来的挑战
1.2.2 Nosql特点【未完善】
-
易扩展性
-
高性能
-
灵活的数据模型
-
高可用
1.2.3Nosql(非关系型数据库)与Mysql(关系型数据库)的区别【未完善】
-
存储方式
-
存储结构
-
存储规范
-
扩展方式
-
查询方式
-
规范化
-
事务性
-
读写性能
-
授权方式
1.3【背】Nosql基础理论
1.3.1 CAP原则
CAP原则包括 一致性(C),可用性(A),分区容错性(P);
CAP原则中,一个分布式系统只能同时实现上诉的两个要素,不可同时实现三个。
CAP原则-三大要素 | 内容 |
---|---|
一致性(consistency) | 系统在执行过某项操作之后,仍然处于一致的状态。在分布式系统中,更新操作执行成功后,用户应该读取到最新的值,这样的系统被认定为具有一致性。 |
可用性(Availability) | 每一个操作在一定的时间内返回结果,若超时,则认为是不可用的。 |
分区容错性(P->Partition Tolerance) | 系统在遇到网络分区故障时,任然可以保证对外提供满足一致性和可用性的服务,除非整个网络都发生了故障。 |
1.3.2 BASE理论
发表人 | Dan Pritchett |
---|---|
BASE理论 | 是对CAP原则中 一致性和可用性权衡的结果,也是CAP理论的延伸 |
核心思想 | 即使无法保证系统的强一致性,也要根据自身业务特点,使用恰当方式来达到最终一致性 |
BASE理论-三大要素 | 内容 |
---|---|
基本可用 | 是指在分布式系统中再出现不可预知的故障的时候,允许部分可用性损失,保证系统的核心可使用即可 |
软状态 | 允许系统在不同节点的数据副本之间进行数据同步的过程存在延迟 |
最终一致性 | 是指在系统中的所有数据副本经过一定时间后,最终达到一致的状态 |
BASE理论与ACID理论的区别 | BASE理论 | ACID理论 |
---|---|---|
一致性 | 最终一致性 | 强一致性 |
可用性 | 可用性优先 | 可用性不做要求 |
灵活性 | 变化速度快、灵活 | 难以变化 |
1.3.3 最终一致性
类型 | 描述 |
---|---|
强一致性 | 要求集群中所有的节点状态实时保持一致 |
弱一致性 | 不要求集群中所有的节点状态实时保持一致,最终一致性是弱一致性的一种特殊形式。 Nosql通常选择最终一致性的思想设计,从而使得系统达到高可用性和高扩展性 |
1.4 Nosql数据库理论【了解】
Nosql数据库分类 | 描述 |
---|---|
键值对存储数据库 | Nosql中的一种,键值对存储数据库的结构实际上是一个映射,即(key)是键查找每条数据的唯一标识符 |
文档存储数据库 | 文档是结构化的数据(JSON格式) |
列式存储数据库 | 以列为单位储存数据 |
图形存储数据 | 是Nosql中的一种类型,主要应用图形理论来存储实体之间的关系信息 |
第二章
第三章 Mongodb数据库操作
3.1 mongodb数据库基本操作
操作名称-数据库操作 | 命令 |
---|---|
启动mongodb | |
新建数据库 | use DATABASE_Name |
查看数据库 | show dbs |
查看当前数据库 | db |
删除数据库 | db.dropDatabase |
3.2 集合操作
集合操作 | |
---|---|
【显式】创建集合 | db.createCollection(COLLECTION_NAME,[OPTIONS]) |
【隐式】创建集合 | db.createCollection(COLLECTION_NAME) |
查看集合 | show.collections |
删除集合 | db.COLLECTION_NAME.drop |
3.3 文档操作
文档操作 | |
---|---|
单文档插入 | db.collection_name.insert(document) |
多文档插入 | db.collection_name.insertMany({document1,document2}) |
查询文档(整个文档) | db.collection_name.find().pretty() 【pretty()整理文档更好阅读】 |
查询文档(条件查询) | “查看条件查询表” |
文档更新 | 【例子】db.comment.update({“context”:“1234”},{$set{“context”:“2345”}}) |
文档删除(整个文档) | db.collection_name.remove |
文档删除(条件删除) | 【例子】db.collection_name.remove({“nickeName”:“陶”}) |
3.4 查询操作【扩展】
操作符 | 操作符名称 | 操作例子 |
---|---|---|
$and | 与 | db.comment.find({$and:[{“userid”:“1005”,“nickName”:“陶”}]}) |
$or | 或 | db.comment.find({$or:[{“userid”:“1”},{“userid”:“2”}]}) |
$gt | 大于 | db.comment.find({“userid”:{$gt:“1005”}}).pretty() |
$lt | 小于 | db.comment.find({“userid”:{$lt:“1005”}}).pretty() |
$gte | 大于等于 | db.comment.find({“userid”:{$gte:“1005”}}).pretty() |
$lte | 小于等于 | db.comment.find({“userid”:{$lte:“1005”}}).pretty() |
$ne | 不等于 | db.comment.find({“userid”:{$ne:“1005”}}).pretty() |
$in | 包含 | db.comment.find({“_id”:{$in:[“1”,“3”]}}).pretty() |
$nin | 不包含 | db.comment.find({“_id”:{$nin:[“1”,“3”,“5”]}}).pretty() |
特定类型查询操作 | 操作例子 |
---|---|
NUll 类型查询 | db.comment.find({“state”:null}).pretty() |
正则表达式查询 【模糊查询】 | db.comment.find({“content”:“/^专家/”}).pretty() |
精确查询 | db.comment.find({“phone”:{“homePhone”:“1234”,“mobilePhone”:“1234”}}).pretty() --二维数组精确查询 |
点查询 | db.comment.find({“phone.homePhone”:“1234”}) --二维数组点查询 |
3.5 聚合操作
aggregate是指查询集合中所有文档
管道操作符 | 操作名称 | 例子 | |
---|---|---|---|
$group | 分组 | db.comment.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{"_id":"userid}}]).pretty() | |
$limit | 限制 | db.comment.aggregate({$limit:3}) | |
$sort | 排序 | db.comment.aggregate([{$sort:{“age”:-1}}]) | -1 降序 1升序 |
$project | 修改文档结构 | db.comment.aggregete([{$project:{“_id”:“0”}}]) | 删除增加字段 |
$skip | 跳过指定数量文档,返回剩下的文档 | db.comment.aggregate([{$skip:{“_id”:“4”}}]) |
管道表达式 | 表达式名称 | 例子 |
---|---|---|
$sum | 总和 | db.product.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{"_id":"type",“price”:{ s u m : " sum:" sum:"price"}}}]) |
$avg | 平均值 | db.product.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{"_id":"type",“price”:{ a v g : " avg:" avg:"price"}}}]) |
$min | 获取对应值的最小值 | db.product.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{"_id":"type",“price”:{ m i n : " min:" min:"price"}}}]) |
$max | 获取对应值的最大值 | db.product.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: max:{"_id":"type",“price”:{ m a x : " max:" max:"price"}}}]) |
$push | 将分组结果插入到一个数组中 | db.product.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{"_id":"type",“tags”:{ p u s h : " push:" push:"name"}}}]) |
$first | 获取分组文档中的第一个文档 | db.product.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{"_id":"type",“FirstProcuct”:{ f i r s t : " first:" first:"name"}}}]) |
$last | 获取分组文档中的最后一个文档 | db.product.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{"_id":"type",“LastProduct”:{ l a s t : " last:" last:"name"}}}]) |
第四章 副本集
4.1 副本集概述
副本集是一组Mongodb实例保持其相同数据集的集群,由一个主服务器和多个副服务器构成。通过复制将数据的更新由主服务器推送到各个副本服务器上。副本集可提供冗余和高可用性,是所有生产部署的基础。
功能 | 描述 |
---|---|
数据的冗余 | 副本集可以确保副本结点与主节点数据的更新,以防止单个数据库服务崩溃造成的数据丢失问题 |
自动故障转移 | 副本集没有固定的主节点,整个集群会选举出一个主节点,当这个主节点不能正常工作时,会选举一个副本结点作为主结点,以保证客户端数据的正常使用 |
读写分离 | 副本集可以将读写请求分流到所有副本上,以减轻主节点读写压力 |
4.2 副本集架构
主节点 副节点 仲裁节点
第五章 分片
5.1 架构
架构 | 描述 | 数量 | 服务器 |
---|---|---|---|
分片服务器 | 实际储存数据的组件,持有完整数据集的一部分 | 3 | shard1(主、副、仲裁),shard2,shard3 |
路由服务器 | 主要提供客户端应用程序与分片集群的交互的接口 | 2 | mongos1,mongos2 |
配置服务器 | 储存着分片集群的持久化元数据 | 3 | 主、副、副 |
第六章 GridFS
6.1 存储结构
GridFS使用两个集合存储文件。一个集合是fs.chunks, 用于存储文件内容的二进制数据;一个集合是fs.files,用于存储文件的元数据。
fs.chunks: GirdFS将文件切分为多个大小为255KB的二进制数据块
fs.files: 存储文件的元数据
Grids 查询的过程:使用GridsFS 查询时。Mongodb首先从集合fs.flies中获取数据信息,根据获取的元数据集合,fs.chunks查找符合要求的块(files_id 与 元数据中_id相同的块)
第七章 Redis 操作
7.1 特点
- 读写速度快
- 支持多种数据结构
- 功能丰富
- 应用广泛
7.2 应用场景
- 缓存
- 构建队列系统
- 排行榜
- 实时的反垃圾系统
- 过期数据自动处理
- 计数器应用
7.3 支持的数据结构
- String
- List
- Set
- Hash
- Sorted Sets
7.4 键操作
7.4.1 redis操作
启动redis服务: Redis-server.exe redis.windows.conf
启动redis客户端: redis-cil.exe -h 127.0.0.1 -p 6379
7.4.2 键操作
操作命令【键】 | 描述 | 例子 |
---|---|---|
set | 设置单个键的值 | set name “tss” |
mset | 设置多个键的值 | set name “tss” age “18” |
key | 查找所有给定模式的正则表达式的键 | key * 【查询所有】 |
get | 获取单个值 | get name |
mget | 获取多个值 | mget name age |
dump | 序列化指定的键并返回被序列化的值 | dump name |
exists | 判断键是否存在 【0 不存在 1存在】 | exists name |
type | 返回键的类型 | type name |
rename | 修改键的名称 | rename name username |
expire | 设置键的生存时间 | expire name 30 |
ttl | 查看指定键的剩余过期时间 | ttl name |
persist | 移除指定键的生存时间 | persist name |
del | 删除指定键 | del name |
操作命令【字符串】 | 描述 | 例子 |
---|---|---|
getset | 获取键并赋值 | getset name “tss” |
strlen | 获取键的长度 | strlen name |
getrange | 获取键值指定索引范围的值 | getrange name 0 1 【返回 ”ts“】 |
setrange | 设置键从指定索引范围的值 | setrange name 1 “new” 【返回 “tnew”】 |
append | 在指定键的值末尾添加新内容 | append name '“add” 【返回 ”tssadd“】 |
|
| strlen | 获取键的长度 | strlen name |
| getrange | 获取键值指定索引范围的值 | getrange name 0 1 【返回 ”ts“】 |
| setrange | 设置键从指定索引范围的值 | setrange name 1 “new” 【返回 “tnew”】 |
| append | 在指定键的值末尾添加新内容 | append name '“add” 【返回 ”tssadd“】 |