计算机速度比较: CPU -> 寄存器 -> 缓存L1/L2/L3 -> 内存 -> 硬盘 -> 网卡 -> BIOS

LMAP: Linux + MySQL + Apache + PHP/Python
Windows Server + SQL Server + ASP.net

SQL(MySQL、Oracle、DB2) 应用场景 :

1. 高度要求事务性场景、银行、物流、贸易、金融,需要大量原子性操作(多个操作共存亡)。
2. 需要持久化存储的 "冷数据" (无需经常改动的数据)。
3. 对安全性要求高的数据(SQL已沉淀几十年, 成熟稳定)。
4. 需要通过统一的 SQL语句 处理的场景(非关系型数据库的语法各不相同)。
5. 业务需要明确的多表结构关系的设计和字段的设计(表间关系错综复杂, 需要经验丰富的架构师)。

NoSQL(内存+硬盘) 应用场景 :

1. 拥有灵活的数据结构, 但也需事先设计表结构关系。
2. 需要存储 IO要求高、"热数据" (随时改动的数据) 的场景[NoSQL基于内存,速度高效]。
3. 高度伸缩性,更易扩展,搭建集群。
4. 较适合于互联网时代多变的数据类型存储。

MongoDB 数据库

1. 安装方式:

(Ubuntu 16)第一种: sudo apt-get install -y mongodb-org
(Ubuntu 18)第二种: sudo apt install mongodb

2. 开启服务:

开启 MongoDB 服务: sudo mongod
第一次开启前需手动创建 MongoDB数据库 保存数据的目录: sudo mkdir -p /data/db (递归创建目录) sudo chmod /data/db 777 (给定权限)

开启 MongoDB shell客户端服务: mongo

3. MongoDB数据库 常用命令

# 查看当前所在数据库
> db

# 查看所有的数据库
> show dbs

# 切换到指定数据库,若切换到不存在数据库不会报错,也无需额外创建数据库、集合,当写入数据时会自动创建
> use youyuan

# 查看当前数据库下所有集合(类似于SQL的table)
> show collections

# 查看当前数据下 指定集合 的所有数据
> db.beijing_mm.find()

# 删除当前数据库下 指定的集合
> db.beijing_mm.drop()

#删除当前数据库
> db.dropDatabase()

4. MongoDB数据库 增删改查,remove默认删除所有,update默认更新一条

a. MongoDB 增加数据 insert() -- python代码实现见 "mongodb_insert.py"

# 第一种: 直接写入一条文档
> db.stu.insert({ "_id" : 1, "name" : "刘备", "age" : 40, "hometown" : "蜀" })

# 第二种: 先创建一个空的文档,依次添加数据,最后统一写入
> data = {}
> data._id = 2
> data.name = "关羽"
> data.age = 38
> data.hometown = "蜀"
> db.stu.inesrt(data)

b. MongoDB 删除数据 remove() -- python代码实现见 "mongodb_remove.py"

1. remove() 默认删除所有符合条件的 文档数据
> db.stu.remove({age : 35})

2. remove() 通过第二个参数 {justOne : true} 来删除第一条符合条件的文档数据
> db.stu.remove({age : 38}, {justOne : true})

3. remove() 通过空的参数,可以删除当前集合下所有文档数据
> db.stu.remove({})
> db.stu.drop() # 删除集合效果相同

4. 在Python中使用: delete_one 和 delete_many

c. MongoDB 修改更新数据 update() -- python代码实现见 "mongodb_update.py"
update至少需提供两个参数: 第一个参数, 匹配的条件; 第二个参数表示, 修改的数据; 第三个参数{multi : true} 表示处理所有文档数据(默认只处理第一条文档)

1. update() 默认将匹配的文档数据,全部替换为 第二个参数的文档数据,但是_id 不变
> db.stu.update({name : "刘备"}, {age : 38, hometown : "蜀国"})

2. update() 通过 $set 修饰符,可以 修改/添加 特定的字段
# 只修改 刘备的 age 为40,并新增gender 为 true
> db.stu.update({name : "刘备"}, {$set : {age : 40, gender : true}})

3. 默认update() 只处理第一条文档,通过 {multi : true} 处理所有文档
> db.stu.update({hometown : "蜀"}, {$set : {gender : true}}, {multi : true})

d. MongoDB 新增+替换 整条文档数据 save()
根据 _id 判断: 如果 _id 已存在,则替换一条文档数据; 如果 _id 不存在, 则新增文档数据。

# _id 不存,新增一条文档数据
> db.stu.save({_id : 2, "name" : "诸葛亮", age : 32, hometown : "蜀", gender : true})
# _id 存在,替换该文档数据
> db.stu.save({_id : 2, "name" : "诸葛孔明", age : 32, hometown : "蜀", gender : true})

e. MongoDB 查询数据 find()

1. 基本查询: 返回所有符合条件的文档数据
> db.stu.find() # 默认返回前20条数据
> db.stu.find({age : 32}).pretty() # 一个字段占据一行的格式输出结果
> db.stu.findOne({age : 32}) # 仅输出一条符合条件的文档数据

2. 比较运算符 : 用来比较数值大小(通用用于比较数字,不建议比较字符串(会比较首字母的ascii值)):

# 默认等于
> db.stu.find({age : 18})
# 大于
> db.stu.find({age : {$gt : 18}})
# 小于
> db.stu.find({age : {$lt : 18}})
# 大于等于
> db.stu.find({age : {$gte : 18}})
# 小于等于
> db.stu.find({age : {$lte : 18}})
# 不等于
> db.stu.find({age : {$ne : 18}})

# 组合使用: 查找age 大于 16 小于等于 40 的文档数据
> db.stu.find({age : {$gt : 16, $lte : 40}})

3. 逻辑运算符 : 用来表示多个条件的 逻辑关系(与 或)
将多个条件 独立,并全部保存在数组中,再通过 与关系$and 或关系$or 修饰

> db.stu.find({age : {$lt : 30}, gender : false}) # 查询年龄小于30 并且 性别女性 的数据

> db.stu.find({$and : [{age : {$lt : 30}}, {gender : false}]}) # 查询年龄小于30 并且 性别女性 的数据

> db.stu.find({$or : [{age : {$lt : 30}}, {gender : false}]}) # 查询年龄小于30 或者 性别女性 的数据

# 1. 找出 age 小雨等于20岁 或 gender 为 false 的文档。 2. 再找出 hometown 为 蒙古
> db.stu.find({$and : [{hometown : "蒙古"}, {$or : [{age : {$lte : 20}}, {gender : false}]} ] })

4. 范围运算符 : 用来判断字段值是否在指定的数据范围内 $in $nin
# 查找 age 值 在 指定数字范围内的文档数据
> db.stu.find({age : {$in : [18, 19, 20, 40]}}) # 查询年龄等于18、19、20、40的数据

# 查找 hometown 值 在 指定数字范围内的文档数据
> db.stu.find({hometown : {$in : ["蒙古", "桃花岛"]}})
# 查找 hometown 值 不在 指定数字范围内的文档数据
> db.stu.find({hometown : {$nin : ["蒙古", "桃花岛"]}})

5. 正则表达式 : 可以通过正则表达式查询结果

# 正则第一种写法: '//' 内包含的是 正则表达式,匹配所有name以 段开头 的文档数据(适合处理中文)
> db.stu.find({name : /^段/})

# 正则第二种写法: {$regex : "正则"} 适合处理英文
> db.stu.find({name : {$regex : "^段"}})
{ "_id" : 8, "name" : "bIgCat", "age" : 18, "hometown" : "汉", "gender" : true }
{ "_id" : 9, "name" : "BigCat", "age" : 18, "hometown" : "汉", "gender" : true }
# 查询 所有name 以 b开头 的文档(且忽略 b 大小写)
> db.stu.find({name : {$regex : "^b", $options : "$i"}})

6. 自定义函数查询 $where : 可以自定义一个 JavaScript函数 执行查询(通常用于补充)
# $where 表示自定义函数执行,会返回集合里的所有符合条件的文档
> db.stu.find({$where : function() {return this.age >= 20}})

# 结果等同于下面语句
> db.stu.find({age : {$gte : 20}})

5. MongoDB 处理查询结果

a. limit() & skip() : limit() 是限定个数输出 ; skip() 是跳过个数再输出。 在一起组合使用时,一定是先 skip() 再 limit()

> db.stu.find().limit(3) # 限定只输出三条文档数据
> db.stu.find().skip(3) # 跳过前三个文档数据,输出后面的数据
> db.stu.find().skip(3).limit(4) # 跳过前三个,限定输出后面的4个

b. 投影输出 : 对文档的特定字段进行处理(显示或不显示)。 在 find() 中添加第二个参数,表示启用投影,可以对字段进行投影处理
# 只显示 name 和 age,其他默认不显示
> db.stu.find({}, {name : 1, age : true})
# 不显示 age 和 gender,其他默认显示
> db.stu.find({}, {age : 0, gender : false})
# 不管是 显示还是不显示, _id 是个特殊的字段,默认都会显示(除非手动指定不显示)
> db.stu.find({}, {age : 1, name :true, _id : false})

注: 显示使用 1/true , 不显示使用 0/false,除_id字段之外不能混合使用0-1/true-false

c. 排序 sort() : 对文档的特定字段进行排序处理(1 为升序, -1 为降序)
# 组合排序:先对age进行升序排序,如果有相同 age值,再按 _id进行降序排序
> db.stu.find({"gender" : true}).sort({age : 1, _id : -1})

注意:在Python代码中,sort将做为 find()方法的参数使用,避免和Python的sort冲突
stu.find({"gender" : True}, sort=[("age", 1), ("_id", -1)])

d. 统计个数 count() : 统计所有查询结果的个数,返回一个数字
# 推荐写法
db.stu.find({gender : true}).count()
# 不建议
db.stu.count({gender : true})

6. MongoDB 索引,普通索引可提高查询效率,唯一索引可用于去重,索引过多会影响数据库写入速度,所以需要进行读写分离

在MongoDB数据库中增加10000条数据: for(i=0;i<1000000;i++) { db.data.insert({_id : i, name : "name"+i, age : i+1})}

1. 查看当前集合下的所有索引
> db.data.getIndexes()

2. 查看find()执行状态(可以统计执行耗时)
> db.data.find({name : "name9527"}).explain("executionStats")

3. 创建索引
> db.data.ensureIndex({name : 1, age : 1})

4. 创建唯一索引 (根据字段创建的唯一索引,如果后续有相同字段值 则无法写入,可用于去重)
> db.data.ensureIndex({"name" : 1}, {"unique":true})

5. 删除索引
#注意:删除索引根据索引名称删除,可以通过 getIndexes() 查询索引名
> db.data.dropIndex("name_1")

7. MongoDB 权限管理

普通模式的MongoDB服务: sudo mongod 这种模式下,任何人都是最高权限
开启权限模式的MongoDB服务: sudo mongod --auth 权限模式下,不同账户指定权限操作数据

1. 开启服务: sudo mongod --auth

2. 创建用户
> use admin
#第一个用户必须是root权限的用户,需要之后通过登录才可以创建其他用户
> db.createUser({uesr : "python", pwd : "123456", roles : ["root"]})

3. 登录到root用户
> use admin
> db.auth("python", "123456")

4. 创建其他用户,并指定权限
> db.createUser({
user : "xiaowang",
pwd : "xiaowang123",
# 对db1 只读权限, db2 有读写权限
roles : [{role : "read", db : "db1"}, {role : "readWrite", db : "db2"}]
})

5. 查看当前MongoDB的所有用户
> use admin
> show users

6. 删除用户(root用户也可以删除自身)
> use admin
> db.dropUser("xiaowang")

8、MongoDB数据库的 备份和恢复(以数据库为单位,处理远程数据库)

1. 备份命令 : 提供参数 -h 被备份的主机ip -d 数据库名 -o 备份到本机的指定目录
> sudo mongodump -h 192.168.28.50 -d movie -o ./

2. 恢复命令: 提供参数 -h 被恢复的主机IP -d 数据库名 --dir 指定备份的数据库目录
> sudo mongorestore -h 192.168.28.55 -d movie --dir ./movie

9、MongoDB数据的 导出和导入(以集合为单位,处理本地数据库)

1. 导出命令 : -d 被导出的数据库 -c 被导出的集合名 -o 导出的文件名 (json、csv)
> sudo mongodexport -d test -c stu -o stu.json
> sudo mongodexport -d test -c stu -o stu.csv --type csv -f _id,name,hometown,age,gender

2. 导入命令 : -d 被导入的数据库 -c 被导入的集合名 --file 需要导入的json文件
> sudo mongoimport -d test -c stu --file stu.json

8、9 通常和Linux的 crontab 定时任务合用。

Spider-four的更多相关文章

  1. spider RPC入门指南

    本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...

  2. Scrapy:为spider指定pipeline

    当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...

  3. spider RPC过滤器

    spider支持在请求执行前或完成后进行特殊处理,比如安全性检查.敏感字段混淆等等.为此,spider提供了BeforeFilter和AfterFilter.其执行位置如下图所示: 流水线插件配置在s ...

  4. spider RPC插件化体系

    为了满足灵活扩展的需要,spider支持灵活的自定义插件扩展,从功能上来说,插件和过滤器的差别在于过滤器不会阻止请求的执行同时对于主程序不会有API上的影响(比如servlet 过滤器和监听器)(最多 ...

  5. spider RPC管理接口

    为了在独立管理模式下尽可能的容易运行时排查问题,spider中间件提供了一系列restful api用于动态管理当前节点的路由,下游节点等.目前支持的RESTFUL API如下所示: 功能 服务号 R ...

  6. spider RPC高级特性

    多租户 spider原生支持多租户部署,spider报文头对外开放了机构号.系统号两个属性用于支持多租户场景下的路由. 多租户场景下的路由可以支持下述几种模式: n  系统号: n  系统号+服务号( ...

  7. spider RPC安全性

    spider提供了多重安全保障机制,目前主要支持接入握手校验,报文完整性校验,报文加密,报文长度检查四种机制. 接入认证 spider使用两次握手校验,其握手流程如下: 签名AES加密的方式实现. l ...

  8. spider RPC开发指南

    协议与兼容性 spider使用java语言开发,使用Spring作为IoC容器,采用TCP/IP协议,在此基础上,结合SaaS系统模式的特性进行针对性和重点设计,以更加灵活和高效的满足多租户系统.高可 ...

  9. spider 配置文件参考

    spider有一个配置文件spider.xml,为xml格式,spider.xml采用DTD进行管理,用于管理spider的所有特性.路由.高可用等. 配置文件支持三种不同的方式进行指定: 1. 通过 ...

  10. spider RPC性能测试报告

    测试环境部署结构 测试用例 类 别 说明 请求报文 194字节({"systemId":"PL","appVersion":"qq ...

随机推荐

  1. C++ Opencv split()通道分离函数 merge()通道合并函数 使用操作详解

    一. split()通道分离函数 split()函数的C++版本有两个原型,他们分别是: C++: void split(const Mat& src, Mat*mvbegin);//& ...

  2. LabVIEW(一):知识入门

    一.DAQ基础知识简介 1.DAQ是英文Data Acquisition (数据采集)的缩写. 数据采集(DAQ)是指测量:电压.电流.温度.压力.声音.编码数据等电气或物理现象的过程. 2.数据采集 ...

  3. 应用监控CAT之cat-consumer源码阅读(二)

    之前讲了 cat-client 进行cat埋点上报,那么上报给谁呢?以及后续故事如何?让我们来看看 cat-consumer 是如何接收处理的? 由cat-client发送数据,cat-consume ...

  4. Windows平台下kafka环境的搭建

    近期在搞kafka,在Windows环境搭建的过程中遇到一些问题,把具体的流程几下来防止后面忘了. 准备工作: 1.安装jdk环境 http://www.oracle.com/technetwork/ ...

  5. 解决svn图标不显示(绝对有用)

    经常遇到svn图标不显示的问题,然后经过长时间的查找终于找到了一个最最管用的办法,在这里分享给的大家

  6. 利用 ELK 搭建 Docker 容器化应用日志中心

    利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 ...

  7. RabbitMQ访问控制

    Access Control (Authentication, Authorisation) in RabbitMQ 认证和授权这两个概念经常容易被混淆,甚至被互换使用.在RabbitMQ中这是错的, ...

  8. mysql 开发进阶篇系列 52 权限与安全(系统四个权限表的粒度控制关系)

    一.概述 接着上篇的权限介绍,当用户进行连接的时候,权限表的存取过程有以下两个阶段: (1) 先从user表中的host,user, authentication_string 这3个字段中判断连接的 ...

  9. 里氏替换原则(LSP)

    替换原则由MIT计算机科学实验室的Liskov女士在1987年的OOPSLA大会上的一篇文章中提出,主要阐述有关继承的一些原则,故称里氏替换原则. 2002年,Robert C.Martin出版了一本 ...

  10. 深入MySQL复制(三):半同步复制

    1.半同步复制 半同步复制官方手册:https://dev.mysql.com/doc/refman/5.7/en/replication-semisync.html 默认情况下,MySQL的复制是异 ...