一、三种数据库的对比
MongoDB、MySQL 和 Redis 是三种不同类型的数据库系统,它们在数据模型、存储方式、性能特点、适用场景等方面存在显著区别。以下是它们的详细对比:
1. 数据模型
MySQL
-
类型:RDBMS(关系型数据库)
-
数据模型:以表格的形式存储数据,数据以行和列的形式组织,每行代表一条记录,每列代表一个属性。表之间可以通过外键等机制建立关系。
-
特点:需要预先定义表结构,包括字段名、字段类型、字段长度等,数据结构固定。
MongoDB
-
类型:NoSQL(文档型数据库)
-
数据模型:以文档的形式存储数据,每个文档是一个键值对集合,类似于 JSON 格式。文档存储在集合(Collection)中,集合类似于关系型数据库中的表。
-
特点:不需要预先定义固定的表结构,文档可以有不同的字段和结构,非常灵活。
Redis
-
类型:NoSQL(键值存储数据库)
-
数据模型:以键值对的形式存储数据,支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
-
特点:数据存储在内存中,读写速度极快,适合高并发场景。
2. 存储方式
MongoDB
-
存储位置:数据存储在磁盘上,支持多种存储引擎(如 WiredTiger、MMAPv1 等)。
-
持久化:支持持久化存储,数据不会因服务重启而丢失。
-
适用场景:适合存储半结构化或非结构化数据,如日志数据、用户画像数据等。
MySQL
-
存储位置:数据存储在磁盘上,支持多种存储引擎(如 InnoDB、MyISAM 等)。
-
持久化:支持持久化存储,数据不会因服务重启而丢失。
-
适用场景:适合存储结构化数据,如用户信息表、订单表等,数据之间的关系可以通过外键等机制来维护。
Redis
-
存储位置:数据存储在内存中,支持 RDB(快照)和 AOF(追加文件)两种持久化机制。
-
持久化:虽然数据存储在内存中,但通过 RDB 和 AOF 持久化机制可以将数据定期保存到磁盘上,确保数据的持久性。
-
适用场景:适合高并发、低延迟的场景,如缓存、会话存储、消息队列等。
3. 性能特点
MongoDB
-
读写性能:读写性能较好,尤其是在处理海量数据和高并发场景时表现出色。
-
扩展性:支持水平扩展,可以通过分片(Sharding)将数据分布到多个服务器上,提高系统的性能和容量。
-
事务支持:MongoDB 4.0 及以上版本引入了多文档事务,但其事务机制与 MySQL 的事务有所不同。
MySQL
-
读写性能:在处理关系复杂、事务性强的业务时性能较好,能够保证数据的完整性和一致性。
-
扩展性:支持垂直扩展(增加服务器性能)和水平扩展(如 MySQL Cluster),但水平扩展的复杂性较高。
-
事务支持:支持 ACID(原子性、一致性、隔离性、持久性)事务,适合需要事务保证的场景。
Redis
-
读写性能:读写速度极快,通常可以达到微秒级,适合高并发、低延迟的场景。
-
扩展性:支持主从复制、哨兵系统和集群,可以通过增加更多的内存和服务器节点来实现水平扩展。
-
事务支持:支持事务,但事务的执行是原子性的,不会回滚。
4. 适用场景
MongoDB
-
适用场景:
-
存储半结构化或非结构化数据,如日志数据、用户画像数据等。
-
需要快速开发和迭代的场景,数据结构可能频繁变化。
-
处理海量数据和高并发的场景,如社交媒体应用、物联网应用等。
-
MySQL
-
适用场景:
-
存储结构化数据,如用户信息表、订单表等。
-
需要事务支持和数据一致性的场景,如金融系统、电子商务系统等。
-
需要复杂查询和分析的场景,如数据分析和报表生成。
-
Redis
-
适用场景:
-
缓存热点数据,减少对后端数据库的访问压力。
-
存储会话信息,如用户登录状态。
-
实现消息队列,支持高并发的生产者和消费者。
-
实时数据处理,如排行榜、计数器等。
-
5. 其他特点
MongoDB
-
社区和生态:拥有庞大的社区和丰富的生态系统,有大量的学习资源和工具。
-
成本:社区版开源免费,企业版需要付费购买。
MySQL
-
社区和生态:作为传统的数据库系统,拥有庞大的用户群体和丰富的生态系统,有大量的学习资源、工具和社区支持。
-
成本:社区版开源免费,企业版需要付费购买。
Redis
-
社区和生态:拥有活跃的社区和丰富的生态系统,有大量的学习资源和工具。
-
成本:开源免费,适合各种规模的应用。
总结
-
MongoDB:适合存储半结构化或非结构化数据,支持灵活的数据模型和水平扩展,适合高并发和海量数据场景。
-
MySQL:适合存储结构化数据,支持事务和复杂查询,适合需要数据一致性和复杂分析的场景。
-
Redis:适合高并发、低延迟的场景,支持多种数据结构,适合缓存、会话存储和消息队列等场景。
二、详述MongoDB
1、NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写。NoSQL用于超大规模数据的存储
2、管理工具下载:
MongoDB Compass是什么? - MongoDB Compass - MongoDB Docs
4、常用的 MongoDB 语句
以下是常用的 MongoDB 语句,按功能分类整理:
4.1 数据库操作
-
查看当前数据库:
db
-
列出所有数据库:
show dbs
或show databases
-
切换数据库:
use <database>
,如果数据库不存在,插入数据时会自动创建 -
删除当前数据库:
db.dropDatabase()
4.2 集合操作
-
创建集合:
db.createCollection("collection_name")
,通常使用隐式创建即可,即插入数据时自动创建集合 -
查看当前数据库中的集合:
show collections
或show tables
-
删除集合:
db.collection.drop()
4.3 文档操作
4.3.1 插入文档
-
插入单个文档:
db.collection.insertOne({key:value})
-
插入多个文档:
db.collection.insertMany([{key:value}, {key:value}])
-
插入单条或多条文档:
db.collection.insert({key:value})
或db.collection.insert([{key:value}, {key:value}])
4.3.2 查询文档
-
查询所有文档:
db.collection.find()
-
查询指定条件的文档:
db.collection.find({key:value})
-
查询并限制返回的字段:
db.collection.find({}, {key:1, key:0})
-
格式化查看查询结果:
db.collection.find().pretty()
-
查询并排序:
db.collection.find().sort({key:1})
-
查询并限制返回的文档数量:
db.collection.find().limit(10)
-
查询并跳过指定数量的文档:
db.collection.find().skip(5)
-
使用条件运算符查询:
-
大于:
db.collection.find({key:{$gt:value}})
-
小于:
db.collection.find({key:{$lt:value}})
-
等于:
db.collection.find({key:value})
-
不等于:
db.collection.find({key:{$ne:value}})
-
in:
db.collection.find({key:{$in:[value1, value2]}})
-
not in:
db.collection.find({key:{$nin:[value1, value2]}})
-
-
使用正则表达式查询:
db.collection.find({key:{$regex:"pattern"}})
-
联合查询:
db.collection.find({key1:value1, key2:value2})
4.3.3 更新文档
-
更新单个文档:
db.collection.updateOne({query}, {$set:{key:value}})
-
更新多个文档:
db.collection.updateMany({query}, {$set:{key:value}})
-
替换单个文档:
db.collection.replaceOne({query}, {newKey:newValue})
-
默认更新一个文档,可配置 multi 参数更新多个文档:
db.collection.update({query}, {update}, {multi:true})
-
使用 upsert 参数在查询为空时插入文档:
db.collection.update({query}, {update}, {upsert:true})
4.3.4删除文档
-
删除单个文档:
db.collection.deleteOne({query})
-
删除多个文档:
db.collection.deleteMany({query})
4.4 索引操作
-
创建索引:
db.collection.createIndex({key:1})
-
查看索引:
db.collection.getIndexes()
-
删除索引:
db.collection.dropIndex("index_name")
4.5 其他操作
-
统计集合中的文档数量:
db.collection.count()
-
查看集合的统计信息:
db.collection.stats()
-
查看数据库的统计信息:
db.stats()
-
查看服务器状态:
db.serverStatus()
这些语句涵盖了 MongoDB 的基本操作,包括数据库、集合和文档的增删改查等
三、详述Redis
1、什么是Redis:
REmote DIctionary Server(远程字典服务)Redis, 是一个基于内存的key-value 存储数据库,是跨平台的非关系型数据库。
Redis 基于内存设计的主要原因是内存的高性能和低延迟特性,这使得 Redis 能够快速读写数据,满足高并发和实时处理的需求
2、Redis的值
支持多种数据结构, 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)--散列、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
3、Redis常用场景:
适用于需要快速响应和高并发处理的场景:
-
缓存:通过内存存储热点数据,加速数据访问,减少对后端数据库的访问压力。
-
会话存储:存储用户会话信息,快速读取和更新用户状态
-
消息队列:使用列表或发布/订阅模式实现消息队列。快速处理消息,支持高并发的生产者和消费者
-
分布式锁:利用 Redis 的原子操作实现锁机制。
-
排行榜和计数器:使用有序集合实现排行榜功能。
4. (操作键)基本命令
常用的 Redis 命令:
-
设置键值对:
SET mykey "Hello, Redis!"
-
获取键值对:
GET mykey
-
删除键值对:
DEL mykey
-
设置过期时间:
EXPIRE mykey 60 # 设置 mykey 的过期时间为 60 秒
-
查看所有键:
KEYS *
-
查看键的类型:
TYPE mykey
5. 对值(数据结构)操作
Redis 支持多种数据结构,包括字符串、哈希、列表、集合和有序集合。
对值的操作,主要就是获取和设置
-
字符串(String):
SET mykey "value" GET mykey
-
哈希(Hash):
HSET user:1001 name "Alice" age 25 HGETALL user:1001
-
列表(List):
LPUSH tasks "task1" LPUSH tasks "task2" LPOP tasks
-
集合(Set):
SADD tags "Redis" "Database" SMEMBERS tags
-
有序集合(Sorted Set):
ZADD leaderboard 100 "player1" ZADD leaderboard 150 "player2" ZRANGE leaderboard 0 -1 WITHSCORES
6. 持久化机制
持久化机制,Redis 可以在服务重启后快速恢复数据,确保数据的完整性和一致性。
Redis 的持久化机制是指将内存中的数据保存到磁盘上,以便在 Redis 服务重启后能够恢复数据。
由于 Redis 是基于内存的数据库,数据存储在内存中,一旦服务重启或发生故障,内存中的数据会丢失。
因此,持久化机制对于保证数据的持久性和可靠性至关重要
持两种持久化方式:
-
RDB(快照):在指定时间间隔内生成数据快照,适合数据不频繁变化的场景。
RDB (Redis DataBase)是通过快照的方式将内存中的数据以二进制格式写入磁盘文件。 默认情况下,RDB 持久化是开启的。1)配置 RDB 持久化 在 Redis 的配置文件 redis.conf 中,可以通过以下配置项来设置 RDB 持久化:save <seconds> <changes><seconds>:表示在指定的时间间隔内。 <changes>:表示发生了多少次写操作。例如:save 900 1 # 900秒内至少有1次写操作时,进行一次快照 save 300 10 # 300秒内至少有10次写操作时,进行一次快照 save 60 10000 # 60秒内至少有10000次写操作时,进行一次快照2)如果要关闭 RDB 持久化, 可以将 save 参数列表清空,或者直接注释掉所有 save 行:save ""
-
AOF(追加文件):记录每次的写操作,适合需要更高数据一致性的场景。
AOF 是通过记录每次写操作的命令来实现持久化,这些命令会被追加到一个文件中。 AOF 持久化可以提供更好的数据安全性,但会占用更多的磁盘空间。1)配置 AOF 持久化 在 redis.conf 文件中,可以通过以下配置项来设置 AOF 持久化:appendonly yesyes:启用 AOF 持久化。 no:禁用 AOF 持久化。2)AOF 的写入策略可以通过以下配置项设置:appendfsync alwaysalways:每次写操作都会同步到磁盘,最安全但性能最低。 everysec:每秒同步一次,性能较好,但可能会丢失一秒内的数据。 no:不自动同步,由操作系统决定何时同步。
-
混合持久化
混合持久化是 Redis 4.0 之后新增的一种持久化方式,结合了 RDB 和 AOF 的优点。 在文件开头以 RDB 的形式保存数据,然后追加后续的写操作命令。1) 配置混合持久化 在 redis.conf 文件中,可以通过以下配置项来启用混合持久化:rdb-aof-use-rdb-preamble yesyes:启用混合持久化。 no:禁用混合持久化。2) 关闭持久化 如果需要关闭 Redis 的持久化功能,需要同时关闭 RDB 和 AOF 持久化:2.1)关闭 RDB 持久化:save ""2.2)关闭 AOF 持久化:appendonly no2.3)关闭混合持久化:rdb-aof-use-rdb-preamble no关闭持久化后,需要重启 Redis 服务才能生效。
7. 高可用架构
Redis 提供主从复制和哨兵模式,确保系统的高可用性:
-
主从复制:主节点负责写入操作,从节点负责读取操作。
-
哨兵模式:通过哨兵监控多个 Redis 实例,自动进行故障转移。