|
|
@@ -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地址和端口:
|
|
|
|
|
|

|
|
|
|
|
|
-配置底层有多少个数据库。
|
|
|
+配置底层有多少个数据库:
|
|
|
|
|
|

|
|
|
|
|
|
@@ -76,19 +94,19 @@ vim redis.conf
|
|
|
|
|
|

|
|
|
|
|
|
-配置Redis的持久化机制 - AOF。
|
|
|
+配置Redis的持久化机制 - AOF:
|
|
|
|
|
|

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

|
|
|
|
|
|
-配置Redis的主从复制,通过主从复制可以实现读写分离。
|
|
|
+配置Redis的主从复制(通过主从复制可以实现读写分离):
|
|
|
|
|
|

|
|
|
|
|
|
-配置慢查询。
|
|
|
+配置慢查询:
|
|
|
|
|
|

|
|
|
|
|
|
@@ -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
|
|
|
@@ -144,9 +167,9 @@ Redis有着非常丰富的数据类型,也有很多的命令来操作这些数
|
|
|
|
|
|

|
|
|
|
|
|
-> **说明**:上面的插图来自付磊和张益军先生编著的《Redis开发与运维》一书。
|
|
|
+> **说明**:上面的插图来自付磊和张益军编著的《Redis开发与运维》一书。
|
|
|
|
|
|
-```Shell
|
|
|
+```Bash
|
|
|
127.0.0.1:6379> set username admin
|
|
|
OK
|
|
|
127.0.0.1:6379> get username
|
|
|
@@ -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
|
|
|
@@ -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概述
|
|
|
@@ -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. 查看、创建和删除数据库。
|
|
|
|
|
|
@@ -361,7 +399,6 @@ connecting to: mongodb://172.18.61.250:27017/
|
|
|
> // 删除当前数据库
|
|
|
> db.dropDatabase()
|
|
|
{ "ok" : 1 }
|
|
|
- >
|
|
|
```
|
|
|
|
|
|
2. 创建、删除和查看集合。
|
|
|
@@ -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: '男'})
|
|
|
@@ -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():
|
|
|
@@ -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})
|
|
|
@@ -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/>)都是不错的选择。
|