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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...