NoSQL、Redis、Mongo入门

什么是 NoSQL

NoSQL 是一个非关系型数据库（Not Only SQL），在这种类型的数据库中，数据是以键值对、文档、图形或列族的形式存储的。与关系型数据库相比，NoSQL 数据库具有更好的可扩展性和更高的性能。

NoSQL 数据库的出现是为了解决传统关系型数据库无法解决的大规模数据存储和访问问题。传统关系型数据库的设计是基于 ACID 模型（原子性、一致性、隔离性、持久性），而这些特性使得其无法很好地应对大规模数据的存储和访问。与传统的关系型数据库不同，NoSQL 数据库通常具有更好的可扩展性和更高的性能，可以轻松地处理高并发、海量数据的情况。

NoSQL 的常见类型

NoSQL 数据库通常被分为四种类型：键值数据库、文档数据库、列族数据库和图形数据库。下面我们逐一介绍这些类型。

键值数据库

键值数据库是一种简单的 NoSQL 数据库，其中数据以键值对的形式存储，类似于哈希表。键值数据库通常具有快速的读取和写入速度，并且可以轻松进行水平扩展。Redis 和 Memcached 是两个著名的键值数据库。

文档数据库

文档数据库是一种 NoSQL 数据库，其中数据以 JSON 或 XML 文档的形式存储。与键值数据库不同，文档数据库允许对文档进行嵌套和分层，因此可以更好地表示复杂的数据结构。MongoDB 和 Couchbase 是两个著名的文档数据库。文档数据库的优点在于可以存储和查询半结构化数据，比如日志、博客、评论等。文档数据库还支持动态查询，可以在查询中使用表达式、函数等。

列族数据库

列族数据库是一种 NoSQL 数据库，其中数据以列族的形式存储，类似于表格。每个列族都包含多个列，其中每个列都可以包含多个版本。列族数据库通常用于存储大量的结构化数据，并且可以轻松进行水平扩展。HBase 和 Cassandra 是两个著名的列族数据库。

图形数据库

图形数据库是一种 NoSQL 数据库，其中数据以图形形式存储，类似于网络拓扑结构。图形数据库通常用于存储复杂的关系数据，并且具有快速的查询速度。Neo4j 和 OrientDB 是两个著名的图形数据库。图形数据库的优点在于可以存储和查询复杂的关系数据，比如社交网络、知识图谱等。

Redis

Redis 是一款开源的基于键值对的内存数据库，采用了单线程的架构，支持多种数据类型的操作，如字符串、列表、哈希、集合等。Redis 不仅可以将数据存储在内存中，还可以将数据写入磁盘中。Redis 的主要特点包括：

快速：Redis 将数据存储在内存中，因此可以快速读取和写入数据。

高可用性：Redis 支持主从复制和 Sentinel，可以在主节点宕机时自动转移客户端请求到备用节点。

多种数据类型：Redis 支持字符串、哈希、列表、集合、有序集合等多种数据类型的操作。

丰富的功能：Redis 支持事务、Lua 脚本、自动过期等丰富的功能。

Redis 的安装和配置

在 Ubuntu 系统上，可以使用以下命令安装 Redis。

Copy
sudo apt-get update
sudo apt-get install redis-server

安装完成后，可以使用以下命令启动 Redis 服务。

Copy
redis-server

默认情况下，Redis 的监听地址为 127.0.0.1，端口号为 6379。可以通过修改配置文件 /etc/redis/redis.conf 来修改 Redis 的监听地址和端口号。

Redis 的基本操作

可以使用 Redis 的客户端命令行工具 redis-cli 来连接到 Redis 服务器，并进行各种操作。以下是一些常用的 Redis 操作示例：

Copy
# 连接到Redis服务器
redis-cli

# 设置键值对
set name "John"

# 获取键值对
get name

# 设置过期时间
setex name 10 "John"

# 添加元素到列表
lpush colors "red"
lpush colors "yellow"
lpush colors "blue"

# 获取列表
lrange colors 0 -1

# 添加元素到集合
sadd fruits "apple"
sadd fruits "banana"
sadd fruits "orange"

# 获取集合
smembers fruits

# 添加元素到有序集合
zadd scores 60 "John"
zadd scores 70 "Mike"
zadd scores 80 "David"

# 获取有序集合
zrange scores 0 -1 withscores

在 Python 程序中操作 Redis

可以使用 Python 的第三方库 redis 来方便地操作 Redis。以下是一些使用 redis 库的示例：

Copy
import redis

# 连接到Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)

# 设置键值对
r.set('name', 'John')

# 获取键值对
r.get('name')

# 设置过期时间
r.setex('name', 10, 'John')

# 添加元素到列表
r.lpush('colors', 'red')
r.lpush('colors', 'yellow')
r.lpush('colors', 'blue')

# 获取列表
r.lrange('colors', 0, -1)

# 添加元素到集合
r.sadd('fruits', 'apple')
r.sadd('fruits', 'banana')
r.sadd('fruits', 'orange')

# 获取集合
r.smembers('fruits')

# 添加元素到有序集合
r.zadd('scores', {'John': 60, 'Mike': 70, 'David': 80})

# 获取有序集合
r.zrange('scores', 0, -1, withscores=True)

MongoDB

MongoDB 是一种流行的开源文档数据库，其灵活性和可扩展性使其成为 NoSQL 数据库的佼佼者。MongoDB 支持动态模式，因此可以轻松地存储动态和半结构化数据。此外，MongoDB 还支持水平扩展，因此可以轻松地扩展以处理大量的数据。

MongoDB 的基本概念

在 MongoDB 中，数据库是由多个集合（collection）组成的。每个集合都是由多个文档（document）组成的，每个文档都是一个 JSON 对象。与传统的关系型数据库不同，MongoDB 没有固定的模式，因此可以轻松地处理动态和半结构化数据。MongoDB 的灵活性使得其在 Web 和移动应用程序中使用广泛。

在 Python 程序中操作 MongoDB

可以使用 pymongo 库在 Python 程序中操作 MongoDB。首先，我们需要安装 pymongo 库：

Copy
pip3 install pymongo

然后，我们可以使用以下代码来连接到 MongoDB 服务器并操作数据库：

Copy
from pymongo import MongoClient

# 连接到MongoDB服务器
client = MongoClient('mongodb://127.0.0.1:27017')

# 获取数据库对象
db = client.school

# 获取集合对象
coll = db.students

# 插入文档
coll.insert_one({'stuid': int(1001), 'name': '骆昊', 'gender': True})

# 查询文档
for student in coll.find({'gender': True}):
print('学号:', student['stuid'])
print('姓名:', student['name'])
print('性别:', '男' if student['gender'] else '女')

MongoDB 的查询语法

MongoDB 的查询语法与 SQL 有些不同。以下是一些常见的 MongoDB 查询操作：

SQL | MongoDB | 解释（SQL/MongoDB）
SELECT * FROM table | db.collection.find() | 从集合中选择所有文档
SELECT * FROM table WHERE condition | db.collection.find({field: value}) | 从集合中选择符合条件的文档
SELECT * FROM table WHERE condition ORDER BY field | db.collection.find().sort({field: 1/-1}) | 按照指定字段进行排序
SELECT * FROM table WHERE condition LIMIT n | db.collection.find().limit(n) | 限制返回的文档数量
SELECT DISTINCT field FROM table | db.collection.distinct(field) | 返回指定字段的唯一值列表
SELECT COUNT(*) FROM table WHERE condition | db.collection.find({field: value}).count() | 计算符合条件的文档数量

MongoDB 的聚合操作

MongoDB 还支持聚合操作，用于处理和分析数据集合。以下是一些常见的聚合操作：

$match操作：用于筛选数据集合中符合条件的文档。

$group操作：用于对数据集合进行分组计算。

$sort操作：用于按照指定字段进行排序。

$limit操作：用于限制返回的文档数量。

$skip操作：用于跳过指定数量的文档。

MongoDB 的性能优化

MongoDB 的性能优化包括以下几个方面：

确定合适的索引：索引可以提高查询性能，但是过多的索引会降低写入性能。

分布式部署：MongoDB 支持水平扩展，可以通过分布式部署来提高性能。

避免全表扫描：全表扫描是一种效率低下的查询方式，应该尽可能避免使用。

选择合适的数据类型：选择合适的数据类型可以减小数据量，提高性能。