Skip to content

Commit

Permalink
开始更新数据分析部分内容
Browse files Browse the repository at this point in the history
  • Loading branch information
jackfrued committed Nov 30, 2020
1 parent 913dd1c commit d1f0857
Show file tree
Hide file tree
Showing 23 changed files with 216 additions and 178 deletions.
2 changes: 1 addition & 1 deletion Day31-35/31-35.玩转Linux操作系统.md
Original file line number Diff line number Diff line change
Expand Up @@ -751,7 +751,7 @@ Linux系统的命令通常都是如下所示的格式:
设置hellokitty用户100天后必须修改密码,过期前15天通知该用户,过期后15天禁用该用户。

```Shell
chage -M 100 -W 15 -I 15 hellokitty
chage -M 100 -W 15 -I 7 hellokitty
```

5. 切换用户 - **su**
Expand Down
2 changes: 1 addition & 1 deletion Day36-40/36-38.关系型数据库MySQL.md
Original file line number Diff line number Diff line change
Expand Up @@ -836,7 +836,7 @@ possible_keys: NULL
在上面的SQL执行计划中,有几项值得我们关注:
1. type:MySQL在表中找到满足条件的行的方式,也称为访问类型,包括:ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(非唯一索引扫描)、eq_ref(唯一索引扫描)、const/system、NULL。在所有的访问类型中,很显然ALL是性能最差的,它代表了全表扫描是指要扫描表中的每一行才能找到匹配的行。
1. `type`:MySQL在表中找到满足条件的行的方式,也称为访问类型,包括:ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、ref(非唯一索引扫描)、eq_ref(唯一索引扫描)、const/system、NULL。在所有的访问类型中,很显然ALL是性能最差的,它代表了全表扫描是指要扫描表中的每一行才能找到匹配的行。
2. possible_keys:MySQL可以选择的索引,但是**有可能不会使用**
3. key:MySQL真正使用的索引。
4. rows:执行查询需要扫描的行数,这是一个**预估值**
Expand Down
199 changes: 118 additions & 81 deletions Day36-40/39-40.NoSQL入门.md → Day36-40/39-40.NoSQL数据库入门.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,27 +46,45 @@ Redis是REmote DIctionary Server的缩写,它是一个用ANSI C编写的高性

#### Redis的安装和配置

可以使用Linux系统的包管理工具(如yum)来安装Redis,也可以通过在Redis的[官方网站](https://redis.io/)下载Redis的源代码,解压缩解归档之后通过make工具对源代码进行构建并安装,在更新这篇文档时,Redis官方提供的最新稳定版本是[Redis 5.0.4](http://download.redis.io/releases/redis-5.0.4.tar.gz)
可以使用Linux系统的包管理工具(如yum)来安装Redis,也可以通过在Redis的[官方网站](https://redis.io/)下载Redis的源代码,解压缩解归档之后通过make工具对源代码进行构建并安装,在更新这篇文档时,Redis官方提供的最新稳定版本是[Redis 5.0.10](https://download.redis.io/releases/redis-5.0.10.tar.gz)

```Shell
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
gunzip redis-5.0.4.tar.gz
tar -xvf redis-5.0.4.tar
cd redis-5.0.4
下载:

```Bash
wget https://download.redis.io/releases/redis-5.0.10.tar.gz
```

解压缩和解归档:

```Bash
tar -zxf redis-5.0.10.tar.gz
```

进入Redis源代码目录:

```Bash
cd redis-5.0.10
```

构建和安装:

```Bash
make && make install
```

在redis源代码目录下有一个名为redis.conf的配置文件,我们可以先查看一下该文件。

```Shell
```Bash
vim redis.conf
```

配置将Redis服务绑定到指定的IP地址和端口。
下面我们对Redis的配置文件进行一个扼要的介绍。

配置Redis服务的IP地址和端口:

![](./res/redis-bind-and-port.png)

配置底层有多少个数据库
配置底层有多少个数据库

![](./res/redis-databases.png)

Expand All @@ -76,19 +94,19 @@ vim redis.conf

![](./res/redis-rdb-3.png)

配置Redis的持久化机制 - AOF
配置Redis的持久化机制 - AOF

![](./res/redis-aof.png)

配置访问Redis服务器的验证口令。
配置访问Redis服务器的口令:

![](./res/redis-security.png)

配置Redis的主从复制通过主从复制可以实现读写分离
配置Redis的主从复制通过主从复制可以实现读写分离):

![](./res/redis-replication.png)

配置慢查询
配置慢查询

![](./res/redis-slow-logs.png)

Expand All @@ -98,41 +116,46 @@ vim redis.conf

接下来启动Redis服务器,下面的方式将以默认的配置启动Redis服务。

```Shell
```Bash
redis-server
```

如果希望修改Redis的配置(如端口、认证口令、持久化方式等),可以通过下面两种方式。

方式一:通过参数指定认证口令和AOF持久化方式。
**方式一**:通过参数指定认证口令和AOF持久化方式。

```Shell
```Bash
redis-server --requirepass yourpass --appendonly yes
```

方式二:通过指定的配置文件来修改Redis的配置。
**方式二**:通过指定的配置文件来修改Redis的配置。

```Shell
redis-server /root/redis-5.0.4/redis.conf
```Bash
redis-server /root/redis-5.0.10/redis.conf
```

下面我们使用第一种方式来启动Redis并将其置于后台运行,将Redis产生的输出重定向到名为redis.log的文件中。

```Shell
```Bash
redis-server --requirepass yourpass > redis.log &
```

可以通过ps或者netstat来检查Redis服务器是否启动成功
可以通过`ps`或者`netstat`来检查Redis服务器是否启动成功

```Shell
```Bash
ps -ef | grep redis-server
netstat -nap | grep redis-server
```

接下来,我们尝试用Redis客户端去连接服务器
接下来,我们尝试用Redis命令行工具`redis-cli`去连接服务器,该工具默认连接本机的`6379`端口,如果需要指定Redis服务器和端口,可以使用`-h``-p`参数分别进行指定

```Shell
```Bash
redis-cli
```

进入命令行工具后,就可以通过Redis的命令来操作Redis服务器,如下所示。

```Bash
127.0.0.1:6379> auth yourpass
OK
127.0.0.1:6379> ping
Expand All @@ -144,9 +167,9 @@ Redis有着非常丰富的数据类型,也有很多的命令来操作这些数

![](./res/redis-data-types.png)

> **说明**上面的插图来自付磊和张益军先生编著的《Redis开发与运维》一书。
> **说明**上面的插图来自付磊和张益军编著的《Redis开发与运维》一书。
```Shell
```Bash
127.0.0.1:6379> set username admin
OK
127.0.0.1:6379> get username
Expand Down Expand Up @@ -251,9 +274,14 @@ OK
2) "xuezq"
3) "zhoujl"
4) "chenyx"
127.0.0.1:6379> geoadd pois 116.39738549206541 39.90862689286386 tiananmen 116.27172936413572 39.99
135172904494 yiheyuan 117.27766503308104 40.65332064313784 gubeishuizhen
(integer) 3
127.0.0.1:6379> zrevrank topsinger zhoujl
(integer) 2
127.0.0.1:6379> geoadd pois 116.39738549206541 39.90862689286386 tiananmen
(integer) 1
127.0.0.1:6379> geoadd pois 116.27172936413572 39.99135172904494 yiheyuan
(integer) 1
127.0.0.1:6379> geoadd pois 117.27766503308104 40.65332064313784 gubeishuizhen
(integer) 1
127.0.0.1:6379> geodist pois tiananmen gubeishuizhen km
"111.5333"
127.0.0.1:6379> geodist pois tiananmen yiheyuan km
Expand All @@ -265,28 +293,31 @@ OK

#### 在Python程序中使用Redis

可以使用pip安装redis模块。redis模块的核心是名为Redis的类,该类的对象代表一个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执行的结果。上面我们在Redis客户端中使用的命令基本上就是Redis对象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。
可以使用pip安装名为`redis`的三方库,该三方库的核心是一个名为`Redis`的类,`Redis`对象代表一个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执行的结果。上面我们在Redis客户端中使用的命令基本上就是`Redis`对象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。

```Shell
```Bash
pip3 install redis
python3
```

```Python
进入Python交互式环境,使用`redis`三方库来操作Redis。

```Bash
>>> import redis
>>> client = redis.Redis(host='1.2.3.4', port=6379, password='yourpass')
>>>
>>> client = redis.Redis(host='127.0.0.1', port=6379, password='yourpass')
>>>
>>> client.set('username', 'admin')
True
>>> client.hset('student', 'name', 'hao')
>>> client.hset('student', 'name', 'luohao')
1
>>> client.hset('student', 'age', 38)
>>> client.hset('student', 'age', 40)
1
>>> client.keys('*')
[b'username', b'student']
>>> client.get('username')
b'admin'
>>> client.hgetall('student')
{b'name': b'hao', b'age': b'38'}
{b'name': b'luohao', b'age': b'40'}
```

### MongoDB概述
Expand All @@ -299,53 +330,60 @@ MongoDB将数据存储为一个文档,一个文档由一系列的“键值对

目前,MongoDB已经提供了对Windows、macOS、Linux、Solaris等多个平台的支持,而且也提供了多种开发语言的驱动程序,Python当然是其中之一。

#### MongoDB的安装和配置
#### MongoDB的安装和启动

可以从MongoDB的[官方下载链接](https://www.mongodb.com/download-center#community)下载MongoDB,官方为Windows系统提供了一个Installer程序,而Linux和MacOS则提供了压缩文件。下面简单说一下Linux系统如何安装和配置MongoDB
可以从MongoDB的[官方下载链接](https://www.mongodb.com/try/download/community)下载MongoDB,官方提供了Windows、macOS和多种Linux版本的安装包。下面以CentOS为例,简单说一下如何安装和启动MongoDB

```Shell
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.5.tgz
gunzip mongodb-linux-x86_64-amazon-3.6.5.tgz
mkdir mongodb-3.6.5
tar -xvf mongodb-linux-x86_64-amazon-3.6.5.tar --strip-components 1 -C mongodb-3.6.5/
export PATH=$PATH:~/mongodb-3.6.5/bin
下载服务器和命令行的RPM安装包。

```Bash
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-server-4.4.2-1.el7.x86_64.rpm
rpm -ivh mongodb-org-server-4.4.2-1.el7.x86_64.rpm
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-shell-4.4.2-1.el7.x86_64.rpm
rpm -ivh mongodb-org-shell-4.4.2-1.el7.x86_64.rpm
```

启动MongoDB服务器,需要先创建保存数据的文件夹。

```Bash
mkdir -p /data/db
mongod --bind_ip 172.18.61.250

2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] MongoDB starting : pid=1163 port=27017 dbpath=/data/db 64-bit host=iZwz97tbgo9lkabnat2lo8Z
2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] db version v3.6.5
2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.0-fips29 Mar 2010
...
2018-06-03T18:03:28.945+0800 I NETWORK [initandlisten] waiting for connections on port 27017
```

> **说明**:上面的操作中,export命令是设置PATH环境变量,这样可以在任意路径下执行mongod来启动MongoDB服务器。MongoDB默认保存数据的路径是/data/db目录,为此要提前创建该目录。此外,在使用mongod启动MongoDB服务器时,--bind_ip参数用来将服务绑定到指定的IP地址,也可以用--port参数来指定端口,默认端口为27017。
修改MongoDB的配置文件,将其中`bindIp`选项的值修改为本机IP地址而不是默认的`127.0.0.1`,本机IP地址可以通过`ifconfig`命令进行查看。

```Bash
vim /etc/mongod.conf
```

使用`systemctl`命令启动服务。

```Bash
systemctl start mongod
```

#### MongoDB基本概念

我们通过与关系型数据库进行对照的方式来说明MongoDB中的一些概念
我们通过与关系型数据库的比较来说明MongoDB中的一些概念

| SQL | MongoDB | 解释(SQL/MongoDB |
| ----------- | ----------- | ---------------------- |
| database | database | 数据库/数据库 |
| table | collection | 二维表/集合 |
| row | document | 记录(行)/文档 |
| column | field | 字段(列)/域 |
| index | index | 索引/索引 |
| table joins | --- | 表连接/嵌套文档 |
| primary key | primary key | 主键/主键(`_id`字段) |
| SQL | MongoDB |
| --------------------- | ------------------ |
| database | database |
| table(表) | collection(集合) |
| row(行) | document(文档) |
| column(列) | field(字段) |
| index | index |
| table joins(表连接) | 嵌套文档 |
| primary key | primary key |

#### 通过Shell操作MongoDB

启动服务器后可以使用交互式环境跟服务器通信,如下所示
0. 启动命令行工具,进入交互式环境

```shell
mongo --host 172.18.61.250
```Bash
mongo
```

MongoDB shell version v3.6.5
connecting to: mongodb://172.18.61.250:27017/
```
> **说明**

1. 查看、创建和删除数据库。

Expand All @@ -361,7 +399,6 @@ connecting to: mongodb://172.18.61.250:27017/
> // 删除当前数据库
> db.dropDatabase()
{ "ok" : 1 }
>
```
2. 创建、删除和查看集合。
Expand All @@ -383,16 +420,15 @@ connecting to: mongodb://172.18.61.250:27017/
> // 删除colleges集合
> db.colleges.drop()
true
>
```
> 说明:在MongoDB中插入文档时如果集合不存在会自动创建集合,所以也可以按照下面的方式通过创建文档来创建集合
> **说明**:在MongoDB中插入文档时如果集合不存在会自动创建集合,所以也可以按照下面的方式通过插入文档来创建集合
3. 文档的CRUD操作。
```JavaScript
> // 向students集合插入文档
> db.students.insert({stuid: 1001, name: '骆昊', age: 38})
> db.students.insert({stuid: 1001, name: '骆昊', age: 40})
WriteResult({ "nInserted" : 1 })
> // 向students集合插入文档
> db.students.save({stuid: 1002, name: '王大锤', tel: '13012345678', gender: ''})
Expand Down Expand Up @@ -482,22 +518,23 @@ connecting to: mongodb://172.18.61.250:27017/
"numIndexesAfter" : 2,
"ok" : 1
}
>
```
使用MongoDB可以非常方便的配置数据复制,通过冗余数据来实现数据的高可用以及灾难恢复,也可以通过数据分片来应对数据量迅速增长的需求。关于MongoDB更多的操作可以查阅[官方文档](https://mongodb-documentation.readthedocs.io/en/latest/) ,同时推荐大家阅读Kristina Chodorow写的[《MongoDB权威指南》](http://www.ituring.com.cn/book/1172)。
#### 在Python程序中操作MongoDB
可以通过pip安装pymongo来实现对MongoDB的操作
可以通过pip安装`pymongo`来实现对MongoDB的操作
```Shell
pip3 install pymongo
python3
pip install pymongo
```
进入Python交互式环境,就可以执行以下的操作。
```Python
>>> from pymongo import MongoClient
>>>
>>> client = MongoClient('mongodb://127.0.0.1:27017')
>>> db = client.school
>>> for student in db.students.find():
Expand All @@ -520,8 +557,9 @@ python3
{'n': 3, 'ok': 1.0}
>>> db.students.find().count()
0
>>> coll = db.students
>>> from pymongo import ASCENDING
>>>
>>> coll = db.students
>>> coll.create_index([('name', ASCENDING)], unique=True)
'name_1'
>>> coll.insert_one({'stuid': int(1001), 'name': '骆昊', 'gender': True})
Expand All @@ -539,7 +577,6 @@ python3
学号: 1003
姓名: 白元芳
性别: 男
>>>
```
关于PyMongo更多的知识可以通过它的[官方文档](https://api.mongodb.com/python/current/tutorial.html)进行了解,也可以使用[MongoEngine](<https://pypi.org/project/mongoengine/>)这样的库来简化Python程序对MongoDB的操作,除此之外,还有以异步I/O方式访问MongoDB的三方库[motor](<https://pypi.org/project/motor/>)都是不错的选择。
关于[`pymongo`](https://api.mongodb.com/python/current/tutorial.html)更多的知识可以通过它的官方文档进行了解,也可以使用[`MongoEngine`](<https://pypi.org/project/mongoengine/>)这样的库来简化Python程序对MongoDB的操作,除此之外,还有以异步I/O方式访问MongoDB的三方库[`motor`](<https://pypi.org/project/motor/>)都是不错的选择。
Loading

0 comments on commit d1f0857

Please sign in to comment.