欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【数据库相关MySql、Redis、MongoDB】

【数据库相关MySql、Redis、MongoDB】

2025/4/1 2:30:26 来源:https://blog.csdn.net/weixin_42333261/article/details/146511295  浏览:    关键词:【数据库相关MySql、Redis、MongoDB】

一、三种数据库的对比

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 dbsshow databases

  • 切换数据库use <database>,如果数据库不存在,插入数据时会自动创建

  • 删除当前数据库db.dropDatabase()

4.2 集合操作

  • 创建集合db.createCollection("collection_name"),通常使用隐式创建即可,即插入数据时自动创建集合

  • 查看当前数据库中的集合show collectionsshow 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 实例,自动进行故障转移。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词