標籤:實現 不同 複雜 自動 學習 訪問 查看 設定 函數
Memcached:
Memcache就是一個普通的程式,這個程式進程先申請一個記憶體,預先將可支配的記憶體空間進行分區,
每個分區裡再分成多個塊最大1M,但同一個分區裡,塊的長度是固定的,當資料來的時候通過Socket
Socket有一個監聽的連接埠,往連接埠發送一個字串過來,解析字串如果是插入操作,就將資料進行計算
尋找適合自己長度的快,然後插入進去
為什麼分塊?解決記憶體片段的問題
當用戶端來了一個key/value資料後,它怎樣分配資料,將資料放到哪個伺服器機器上呢?
1、先將key一個雜湊演算法
2、根據雜湊值對伺服器的個數取餘,根據取餘的結果選中儲存當前key-value值的伺服器
3、如果加一台機器,用戶端取資料的時候根據key取餘有可能出現問題,原先可能將資料存到第二台伺服器上,新
加機器後有可能去第三台機器上取資料,而第三台機器沒有這個資料,怎麼解決這個問題?
這個問題直接解決不了,只能把影響降到最低,這裡就有一個一致性哈新演算法
用Memcached緩衝如果其中記憶體不夠時,想擴充這個分布式叢集的時候,怎麼一個
方式可以解決這個資料的問題?
答:一致性雜湊演算法
Redis:redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hashs(雜湊類型)。redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩衝在記憶體中。區別的是redis會周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
MemCache怎麼解決資料衝突(並發訪問、同時修改檔案):
CAS協議:資料過來的時候帶一個自己的版本,允許最後一個擷取服務端資料的人修改
1、不能作為持久化儲存
2、儲存的資料有限制,最多1M,大於1M人為進行分割
3、儲存的資料只能是key-value
4、叢集資料沒有複製和同步機制(一台機器掛了,其他機器的資料也就沒了)
5、記憶體回收不及時 LRU演算法:未使用記憶體-》到期記憶體-》最近最少使用記憶體
Memchae與Redis不同:
1、叢集不相同
mm:通過用戶端驅動實現叢集化
Redis:通過伺服器端配置實現叢集
2、Redis可以進行持久化
1/資料檔案恢複資料 rdb檔案
2/通過日誌恢複資料
3、Redis提供進階的資料結構。隊列、棧等都提供支援
4、Redis是單線程的。處理資料比較小的情況下沒有太大區別,處理大資料mm
效能更高,mm是多線程
緩衝系統的更新機制設計問題。
如下是一個可行的解決方案(假設我們的更新機制是每5分鐘更新一次緩衝):
1)設計兩個緩衝池,記為A、B,而A和B的內容都是從後端伺服器資料庫中擷取到的資料。正常情況下,用戶端的請求都是從緩衝池A中擷取緩衝內容,同時,設定一個全域的變數ref用於記錄當前正在訪問緩衝A的用戶端數量,來一個用戶端請求將ref值加1,響應完一個用戶端請求後ref減一。
2)當緩衝更新時間到時,如果ref不為0,則我們不能直接更新緩衝,因為這時有用戶端正在從緩衝池A取資料。這裡,我們可以借鑒Redis的rehash思想,更新時間到,我們將用戶端的訪問都引導到B緩衝池,此時的緩衝池A不再接受新的用戶端資料請求,A的ref變數只減不增,當ref變數減少到0時,我們便可以更新A緩衝池中的內容了。
MongoDB是一種面向集合(collection)的,模式自由的文檔型的非關係型資料庫,其優勢在於查詢功能比較強大,能儲存海量資料。
mongoDB不支援事務, 可在伺服器端執行任意的 javascript函數,支援 javascript運算式查詢,內建自動分區機制(支援水平資料庫叢集)
所謂“面向集合”(Collection-Oriented),意思是資料被分組儲存在資料集中,被稱為一個集合(Collection)。
每個集合在資料庫中都有一個唯一的標識名,並且可以包含無限數目的文檔
MongoDB:
1、讀寫效能非常高,適應大資料[本身的這種儲存結構,面向集合儲存]]
列之間沒關係、沒約束,就一個列,大部分操作都在記憶體裡面完成
Redis:並不是寫入一條資料就立即寫到磁碟,超過某個閥值時才寫入磁碟
MongoDB:寫入也都寫入記憶體裡去,寫入請求就立即返回,不關心有沒有寫入磁碟,
用db.Users.getLashError()查看有沒有寫入成功,讀也很快:使用空間換時間技術,
把磁碟資料對應到記憶體裡去,而且佔用記憶體的優先順序比較低,官網說的
2、學習成本低、入門容易,上手簡單,配置方便,能夠非常快速解決我們項目中的問題
3、文檔型的資料庫,無模式:資料結構預先沒有規定
4、可以支援部分的複雜查詢
為什麼需要NoSQL非關係型資料庫?
High performance - 對資料庫高並發讀寫的需求
Huge Storage - 對海量資料的高效率儲存和訪問的需求
High Scalability && High Availability- 對資料庫的高可擴充性和高可用性的需求
為什麼用NoSQL而不用傳統的資料庫?
1、傳統的資料庫高並發訪問容易造成死結
2、搭建叢集很簡單,多用戶端可以共用快取
3、讀寫效能很好,1s可以讀取1w次,寫10w次
4、可以實現伺服器與多個用戶端之間主從資料同步
Memcached、Redis、MongoDB