1. 程式人生 > >Memcached、Redis、MongoDB

Memcached、Redis、MongoDB

col 同步機制 asc rdquo 日誌 更多 類型 追加 根據

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