计算机速度比较: 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. 浅谈final关键字的用法

    1.final变量: 常和static一起使用,修饰成员变量或者本地变量.修饰后为常量,不可以再次初始化(再次引用),例如public static final String SUCCESS= &qu ...

  2. 数字(Number)类型(一)

    多行语句 Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句,例如: total = item_one + \ item_two + \ item_three ...

  3. python2程序移植python3的一些注意事项

    1 queue: python2: import Queue python3: import queue 2 queue size: python2: cache = Queue.Queue(maxs ...

  4. 解决 Chrome 下载不了东西 失败 - 已屏蔽 的问题

    或许你怎么也想不到是IE的问题 由于IE的安全设定问题 但是这个锅 确实不应该是IE来背. 因为我IE下载都没出现这个问题. 解决方法是这样的: IE>Internet选项>安全>自 ...

  5. MySQL单表多字段模糊查询

    今天工作时遇到一个功能问题:就是输入关键字搜索的字段不只一个字段,比如 我输入: 超天才 ,需要检索出 包含这个关键字的 name . company.job等多个字段.在网上查询了一会就找到了答案. ...

  6. mybatis框架(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

  7. rest-framework之权限组件

    权限 权限 作用 : 校验用户是否有权限访问 检测权限肯定是在用户认证通过之后,所有可以直接在request中取出用户做判断 先定义一个类,继承 BasePermission. from rest_f ...

  8. java设定一个日期时间,加几分钟(小时或者天)后得到新的日期

    //返回的是字符串型的时间,输入的 //是String day, int x public static String addDateMinut(String day, int x){ SimpleD ...

  9. unittest单元测试框架

    unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...

  10. 从面试连跪到收割offer,回顾我的春招面试历程(研发岗位)

    本文首发于自微信公众号[程序员江湖] 作者How 2 Play Life,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘.自学编程.计算机考研等方面有丰富经验和独到见解,目前致力于分享程 ...