NoSql淺談

来源:https://www.cnblogs.com/zhangxianshen/archive/2018/08/14/9477848.html
-Advertisement-
Play Games

什麼是NoSql NoSQL(Not Only SQL),泛指非關係型的資料庫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱,強調Key-Value Stores和文檔資料庫的優點。為瞭解決大規模數據集合多重數據種類帶來的挑戰而興起的資料庫。有著模式自由,逆規範化,多分區存儲,彈性可擴展,多副 ...


什麼是NoSql

NoSQL(Not Only SQL),泛指非關係型的資料庫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱,強調Key-Value Stores和文檔資料庫的優點。為瞭解決大規模數據集合多重數據種類帶來的挑戰而興起的資料庫。有著模式自由,逆規範化,多分區存儲,彈性可擴展,多副本非同步複製,軟事務等特點。NoSQL用於超大規模數據的存儲。NoSQL資料庫的四大分類:鍵 - 值對存儲,列存儲,文檔存儲,圖形資料庫 優點: 高可擴展性,分散式計算,低成本,架構的靈活性,半結構化數據,沒有複雜的關係

NoSQL資料庫在以下的這幾種情況下比較適用: 1、數據模型比較簡單; 2、需要靈活性更強的IT系統; 3、對資料庫性能要求較高; 4、不需要高度的數據一致性; 5、對於給定key,比較容易映射複雜值的環境。

1.Redis Redis是一個開源的,臨時性鍵值對存儲的記憶體/硬碟型資料庫,他可以做資料庫,緩存和消息的中間件,支持多種數據結構,以及DB消息隊列,適用於數據變化快且資料庫大小可遇見(適合記憶體容量)的應用程式。例如:股票價格、數據分析、實時數據搜集、實時通訊。

2.Memcached Memcached是一個高性能的分散式記憶體對象緩存系統,用於動態Web應用以減輕資料庫負載。 通過在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提供動態、資料庫驅動網站的速度 Memcached基於一個存儲鍵值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並通過memcached協議與守護進程通信。

3.MongoDB 面向無需定義表結構的文檔數據,具有非常快的處理速度,保留了一些友好的SQL特征(查詢,索引),支持JavaScript表達式查詢,硬碟型資料庫,在32位的操作系統上,資料庫限制大小約2.5Gb, 適用於需要動態查詢支持;需要使用索引而不是 map/reduce功能;需要對大資料庫有性能要求;需要使用 CouchDB但因為數據改變太頻繁而占滿記憶體的應用程式

使用對比以及優缺點

從以下幾個維度,對 redis、memcache、mongoDB 做了對比。

1、性能

都比較高,性能對我們來說應該都不是瓶頸。
總體來講,TPS 方面 redis 和 memcache 差不多,要大於 mongodb。

2、操作的便利性

memcache 數據結構單一。(key-value)
redis 豐富一些,數據操作方面,redis 更好一些,較少的網路 IO 次數,同時還提供 list,set,
hash 等數據結構的存儲。
mongodb 支持豐富的數據表達,索引,最類似關係型資料庫,支持的查詢語言非常豐富。

3、記憶體空間的大小和數據量的大小

redis 在 2.0 版本後增加了自己的 VM 特性,突破物理記憶體的限制;可以對 key value 設置過
期時間(類似 memcache)
memcache 可以修改最大可用記憶體,採用 LRU 演算法。Memcached 代理軟體 magent,比如建立
10 台 4G 的 Memcache 集群,就相當於有了 40G。 magent -s 10.1.2.1 -s 10.1.2.2:11211 -b
10.1.2.3:14000 mongoDB 適合大數據量的存儲,依賴操作系統 VM 做記憶體管理,吃記憶體也比較厲害,服務
不要和別的服務在一起。

4、可用性(單點問題)

對於單點問題,
redis,依賴客戶端來實現分散式讀寫;主從複製時,每次從節點重新連接主節點都要依賴整
個快照,無增量複製,因性能和效率問題,
所以單點問題比較複雜;不支持自動 sharding,需要依賴程式設定一致 hash 機制。
一種替代方案是,不用 redis 本身的複製機制,採用自己做主動複製(多份存儲),或者改成   
增量複製的方式(需要自己實現),一致性問題和性能的權衡
Memcache 本身沒有數據冗餘機制,也沒必要;對於故障預防,採用依賴成熟的 hash 或者環
狀的演算法,解決單點故障引起的抖動問題。
mongoDB 支持 master-slave,replicaset(內部採用 paxos 選舉演算法,自動故障恢復),auto sharding 機制,對客戶端屏蔽了故障轉移和切分機制。

5、可靠性(持久化)

對於數據持久化和數據恢復,
redis 支持(快照、AOF):依賴快照進行持久化,aof 增強了可靠性的同時,對性能有所影
響
memcache 不支持,通常用在做緩存,提升性能;
MongoDB 從 1.8 版本開始採用 binlog 方式支持持久化的可靠性

6、數據一致性(事務支持)

Memcache 在併發場景下,用 cas 保證一致性redis 事務支持比較弱,只能保證事務中的每個操作連續執行
mongoDB 不支持事務

7、數據分析

mongoDB 內置了數據分析的功能(mapreduce),其他不支持

8、應用場景

redis:數據量較小的更性能操作和運算上
memcache:用於在動態系統中減少資料庫負載,提升性能;做緩存,提高性能(適合讀多寫
少,對於數據量比較大,可以採用 sharding)
MongoDB:主要解決海量數據的訪問效率問題。

表格比較:

資料庫             memcache            redis 
類型              記憶體資料庫           記憶體資料庫
數據類型    在定義value時就要固定數據類型   不需要
虛擬記憶體            不支持                 支持
過期策略            支持              支持
存儲數據安全          不支持             使用 save 存儲到 dump.rdb 中
災難恢復            不支持         append only file(aof)用於數據恢復

性能

1、類型——memcache 和 redis 都是將數據存放在記憶體,所以是記憶體資料庫。當然,memcache 也可用於緩存其他東西,例如圖片等等。

2、 數據類型——Memcache 在添加數據時就要指定數據的位元組長度,而 redis 不需要。

3、 虛擬記憶體——當物理記憶體用完時,可以將一些很久沒用到的 value 交換到磁碟。

4、 過期策略——memcache 在 set 時就指定,例如 set key1 0 0 8,即永不過期。Redis 可以通 過例如 expire 設定,例如 expire name 10。

5、 分散式——設定 memcache 集群,利用 magent 做一主多從;redis 可以做一主多從。都可 以一主一從。

6、 存儲數據安全——memcache 斷電就斷了,數據沒了;redis 可以定期 save 到磁碟。

7、 災難恢復——memcache 同上,redis 丟了後可以通過 aof 恢復。

NoSQL資料庫的四大分類表格分析

延伸及擴展問題回答參考

問題:redis的存儲方式(鍵值對的存儲方式)

答:現在比較常用的是鍵值對的存儲方式,說到存儲方式,需用從哈希演算法說起,hash演算法將對象轉換為一個散列①,我們在使用的時候會將這個散列轉換為一個大數,這就是hashcode,而hashmap高度依賴於hash和hashcode hashtable預設會開闢4個存儲空間,將獲取到的hashcode求磨,算出下標誌②。也就是說hashtable是鍵值對的存儲方式, 我們一般會用Hashmap分表分庫,hashmap的原理和hashtable相似,他們之間的區別在這裡就不細說了,hashmap分表分庫也是對hashcode求魔然後找下標值,但是下標值里存在數據的話,會自動生成鏈路(在hashmap中的是倒鏈③)

註釋:

①:HashMap 之所以速度快,因為他使用的是散列表,根據 key 的 hashcode 值生成數組下標(通過記憶體地址直接查找,沒有任何判斷),時間複雜度完美情況下可以達到 n1(和數組相同,但是比數組用著爽多了,但是需要多出很多記憶體,相當於以空間換時間)

②:假若hashcode為112,hashtable為4個空間,那麼這個數據存儲的下標值為 112%4=0,也就是說存在了下標為0的空間

③:鏈表存儲是不連續的,查詢慢,插入塊。數組是連續的,查詢快,插入慢


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • '''re模塊 內部實現不是Python 而是調用了c的庫 re是什麼 正則 表達 式子 就是一些帶有特殊含義的符號或者符號的組合 作用: 對字元串進行過濾 在一對字元串中找到所關心的內容 你就需要告訴電腦過濾規則是什麼樣 通過什麼方式來告訴電腦 就通過正則表達式 re模塊常用方法findall ...
  • 最近發現一個網站www.unsplash.com ( 沒有廣告費哈,純粹覺得不錯 ),網頁做得很美觀,上面也都是一些免費的攝影照片,覺得很好看,就決定利用蹩腳的技能寫個爬蟲下載圖片。 先隨意感受一下這個網站: 接下來開始對網頁進行解析: 在該網頁檢查元素,選擇其中一張圖片查看它的代碼 可以看到,圖片 ...
  • 教材:《彙編語言》 王爽 第三版 Charpter 1. 基礎知識 1.1 : 機器語言 1.2 : 彙編語言的產生 1.3 : 彙編語言的組成 1.4 : 存儲器 1.5 : 指令和數據 1.6 : 存儲單元 1.7 : CPU對於存儲器的讀寫 1.8 : 地址匯流排 1.9 : 數據匯流排 1.10 ...
  • JMM簡介 Java Memory Model簡稱JMM, 是一系列的Java虛擬機平臺對開發者提供的多線程環境下的記憶體可見性、是否可以重排序等問題的無關具體平臺的統一的保證。(可能在術語上與Java運行時記憶體分佈有歧義,後者指堆、方法區、線程棧等記憶體區域)。併發編程有多種風格,除了CSP(通信順序 ...
  • 一.標識符 標識符:在java程式中,有些名字是我們自己定義的,那麼這些我們自己定義的名字就叫做自定義的標識符 標識符的命名規則: 1.標識符是由字母(a-z A-Z)、數字、下劃線(_)、美元符號($)組成的 2.標識符不能以數字開頭 3.標識符是嚴格區分大小寫的 4.標識符是沒有長度限制的 5. ...
  • 在C#中消息有兩個指向,一個指向Message,一個指向INotify。這裡主要講INotify。 INotify也有人稱之為[通知],不管叫消息還是通知,都是一個意思,就是傳遞信息。 消息的定義 INotify消息其實是一個介面,介面名叫INotifyPropertyChanged。介面定義如下: ...
  • 持續集成配置之Nuget Intro 本文是基於微軟的 VSTS(Visual Studio Team Service) 做實現公眾類庫的自動打包及發佈。 之前自己的項目有通過 Github 上的 Travis 和 Appveyor,這次主要是用 VSTS 來做的,對比 appveyor 和 vst ...
  • 概要 相信很多朋友在程式生涯中,或多或少都會遇到處理媒體流的需求,而且是採用S端處理,排除代碼上課優化的極限,仍然還是需要很長的時間時,比如: 1:百度網盤在播放視頻的時候,如非VIP會員還需要更長甚至直接斷開流; 2:任何直播視頻在轉碼的時候,不論是否VIP,都會有段緩衝時間,已至於觀看者無法達到 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...