【數據庫相關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 實例,自動進行故障轉移。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899529.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899529.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899529.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Express:Node.js 里的 “閃電俠”》

“你就坐在我身邊&#xff0c;好不好” 什么是Express 官方給出的概念&#xff1a;Express 是基于 Node.js 平臺&#xff0c;快速、開放、極簡的 Web 開發框架。 通俗的理解&#xff1a;Express 的作用和 Node.js 內置的 http 模塊類似&#xff0c;是專門用來創建 Web 服務器…

vue遺漏的知識點(動態組件.組件庫的操作使用)

----動態組件&#xff08;vue2vue3通用&#xff09; <component :is"..."> 的作用 <component> 是 Vue 的內置組件&#xff0c;用于動態渲染其他組件。:is 屬性 用于指定要渲染的組件。它的值可以是&#xff1a; 組件的名稱&#xff08;字符串&#xf…

vue 項目啟動報錯可以讓 cursor啟動

vue 項目啟動報錯可以讓 cursor啟動

SQL EXISTS 與 NOT EXISTS 運算符

EXISTS 和 NOT EXISTS 是 SQL 中的邏輯運算符&#xff0c;用于檢查子查詢是否返回任何行。它們通常用在 WHERE 子句中&#xff0c;與子查詢一起使用。 EXISTS 運算符 EXISTS 運算符用于檢查子查詢是否返回至少一行數據。如果子查詢返回任何行&#xff0c;EXISTS 返回 TRUE&…

Android設計模式之模板方法模式

一、定義&#xff1a; 定義一個操作中的算法的框架&#xff0c;而將一些步驟延遲到子類中&#xff0c;使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 二、結構&#xff1a; AbstractClass抽象類&#xff1a;定義算法的骨架&#xff0c;包含模板方法和若干…

Vue3當中el-tree樹形控件使用

tree懸停tooltip效果 文本過長超出展示省略號 如果文本超出懸停顯示tooltip效果 反之不顯示 這里直接控制固定寬度限制 試了監聽寬度沒效果<template><el-treeshow-checkbox:check-strictly"true":data"data"node-key"id":props"…

QScreen 捕獲屏幕(截圖)

一、QScreen核心能力解析 硬件信息獲取 // 獲取主屏幕對象 QScreen* primaryScreen QGuiApplication::primaryScreen();// 輸出屏幕參數 qDebug() << "分辨率:" << primaryScreen->size(); qDebug() << "物理尺寸:" << primar…

PDF處理控件Aspose.PDF教程:通過C#、Java 和 Python刪除 PDF中的水印

Aspose.PDF 是一個功能強大的庫&#xff0c;旨在以編程方式處理 PDF 文檔&#xff0c;提供創建、編輯、轉換和操作的廣泛功能。它支持 C#、Java 和 Python 等多種編程語言&#xff0c;使開發人員能夠精確高效地自動處理 PDF。 對于開發人員來說&#xff0c;由于自動化和定制化…

基于STC89C51的太陽自動跟蹤系統的設計與實現—單片機控制步進電機實現太陽跟蹤控制(仿真+程序+原理圖+PCB+文檔)

摘 要 隨著我國經濟的飛速發展&#xff0c;促使各種能源使用入不敷出&#xff0c;尤其是最主要的能源&#xff0c;煤炭石油資源不斷消耗與短缺&#xff0c;因此人類尋找其他替代能源的腳步正在加快。而太陽能則具有無污染﹑可再生﹑儲量大等優點&#xff0c;且分布范圍廣&…

【硬件測試】基于FPGA的16QAM+幀同步系統開發與硬件片內測試,包含高斯信道,誤碼統計,可設置SNR

目錄 1.算法硬件測試效果 2.算法涉及理論知識概要 2.1 16QAM調制解調原理 2.2 幀同步 3.Verilog核心程序 4.開發板使用說明和如何移植不同的開發板 5.完整算法代碼文件獲得 1.算法硬件測試效果 本文是之前寫的文章: 《基于FPGA的16QAM幀同步系統verilog開發,包含testb…

多路徑 TCP 調度的另一面

參考前面的文章 一個原教旨的多路徑 TCP 和 MP-BBR 公平性推演&#xff0c;一直都破而不立&#xff0c;不能光說怎樣不好&#xff0c;還得說說現狀情況下&#xff0c;該如何是好。 如果 receiver 亂序重排的能力有限(拜 TCP 所賜)&#xff0c;如果非要在多路徑上傳輸 TCP&…

大數據學習(92)-spark詳解

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

RAG - 五大文檔切分策略深度解析

文章目錄 切分策略1. 固定大小分割&#xff08;Fixed-Size Chunking&#xff09;2. 滑動窗口分割&#xff08;Sliding Window Chunking&#xff09;3. 自然語言單元分割&#xff08;Sentence/Paragraph Segmentation&#xff09;4. 語義感知分割&#xff08;Semantic-Aware Seg…

微信小程序引入TDesign組件后報錯一直提示路徑不對(Component is not found in path)的解決方法

最近在做微信小程序的項目&#xff0c;創建好項目后&#xff0c;按官方方式引入TDesign組件&#xff0c;但還是一直提示報錯&#xff08;Component is not found in path "miniprogram_npm/tdesign-miniprogram/button/button" (using by "pages/login/login&qu…

攔截器和過濾器詳解

在 Java Web 開發中&#xff0c;攔截器&#xff08;Interceptor&#xff09;和過濾器&#xff08;Filter&#xff09;是兩種常見的請求處理機制&#xff0c;它們用于對請求和響應進行預處理和后處理 1. 過濾器&#xff08;Filter&#xff09; 1.1 作用 Filter 主要用于對 請求…

【機械視覺】C#+VisionPro聯合編程———【六、visionPro連接工業相機設備】

【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 目錄 【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 前言&#xff1a; 連接步驟說明 一. 硬件連接 支持的相機接口類型&#xff1a; 連接步驟 2. 軟件配置 Visio…

筆記:基于環境語義的通感融合技術,將傳統通信由“被動接收”轉為“主動感知”

《基于計算機視覺的感知通信融合理論與關鍵技術研發進展》 介紹了聯合研發的基于環境語義的通感融合技術研發進展。 觀點&#xff1a;利用環境感知信息或環境語義輔助通信的通感融合技術成為6G重要方向之一 產出&#xff1a;基于環境感知的毫米波波束管理方案&#xff0c;并…

Kafka 多線程開發消費者實例

目前&#xff0c;計算機的硬件條件已經大大改善&#xff0c;即使是在普通的筆記本電腦上&#xff0c;多核都已經是標配了&#xff0c;更不用說專業的服務器了。如果跑在強勁服務器機器上的應用程序依然是單線程架構&#xff0c;那實在是有點暴殄天物了。不過&#xff0c;Kafka …

zynq7000 + ucos3 + lwip202_v1_2調試過程

1 現在裸機應用上驗證lwip 跑起來可能會報錯&#xff0c;看下面的鏈接解決 zynq 網卡Phy setup error問題 zynq 網卡Phy setup error問題-CSDN博客 2 ping同以后&#xff0c;在zynq上添加ucos系統 鏈接如下&#xff1a; ZYNQ移植uCOSIII_zynq ucos-CSDN博客 3 移植lwip協議…

Android7 Input(二)Linux 驅動層輸入事件管理

概述 在Linux系統中&#xff0c;將鍵盤&#xff0c;鼠標&#xff0c;觸摸屏等這類交互設備交由Linux Input子系統進行管理&#xff0c;Linux Input驅動子系統由于具有良好的和用戶空間交互的接口。因此Linux Input驅動子系統&#xff0c;不止于只管理輸入類型的設備。也可以將其…