一、三種數據庫的對比
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 實例,自動進行故障轉移。