發掘數據庫內存表的用處


 

  內存表(或稱內存數據庫中的表),是數據庫把表中的數據完全放在內存,重啟數據庫后,內存表中的不會有任何數據,但內存表的表結構還存在。首先需要明確一個觀念,使用內存表和程序直接在內存操作理論速度是一樣。以下為內存表的power功能描述。
 
一、內存表的優點:
 
(一)、速度很快
  沒有最快,只有更快。內存的速度是除了cpu cache外最快的存儲設備,所以不要懷疑內存表的速度。理論上內存表的速度和最快通信方式速度是一樣,因為都在內存中操作。缺點在於不能持久存儲,只有揚長避短,才能發揮內存表的優勢。內存速度可達6G/S以上,而硬盤速度不穩定算為0.2G/S,相差30倍以上,有的系統甚至相差100倍以上.
 
(二)、標准sql操作
  兩個應用程序的通信,是多么讓人痛苦,什么文件記錄鎖、管道、隊列、消息隊列、信號燈、共享內存、com組件、soap、xml、soa、json/bson等等,全是奔通信而來,讓人眼花繚亂。巨大的復雜且不說,關是n個操作系統的兼容性就夠頭痛的。而基於sql的內存表跨語言,跨平台,跨虛擬機、跨數據庫、跨老菜鳥。說來說去,還是sql標准帶來的好處。
 
(三)、支持事務
  以上通信不支持事務,是很多高性能通信都不能解決的問題,更別說自定義的socket協議。支持事務在通信可能不是必要,但有了更安全的選擇。
 
二、內存表缺點:
 
(一)、不能持久化
 
  不能存入硬盤,因為硬盤的速度太慢,所以出現了內存表。持久化,只要做到服務正常停止時,把內存表數據保存到普通數據表就可以了,比隊列之類的持久化容易得多。
 
(二)、占用內存過大
 
  現在服務器內存已經很大了,很多內存浪費掉了。用內存表,你的內存使用量完全可以控制。
 
 
三、內存表可發掘功能:
 
(一)、用於進程通信
 
  不同程序的進程通信、汲及各大操作系統內部知識,實現難度大。完全可以內存表來交換數據,解決了硬盤數據表交換數據慢的問題,解決了進程通信不標准化問題,解決多個操作系統進程通信的困難。另外本機通信可以不通過tcp/ip協議,使用相關數據庫的管道通信,進一步提高通信效率。
 
(二)、用於業務系統緩存
 
  一個數據庫支持的系統,都有很多表。為了追求速度,我們經常把不需要頻繁更新的表緩存在應用程序中,但這種緩存不能多個程序共享,對緩存的控制也需要相當的技巧。其實可以保持原有框架不動,建立內存表,表結構和 “需緩存表” 一樣。在應用程序啟動后把 “需緩存表” 數據插入內存表中。當有“需緩存表”有數據更新時,只要再插一份到內存表。解決了自行控制緩存的風險,通過內存表的參數設置解決了內存的使用量問題。
 
(三)、代替網絡通信
 
  特別對於局域網應用,很多時候需要通信網絡通信來解決服務器和客戶端的數據同步問題。網絡通信的本質是進程通信的延伸,但又有自已特點。如會話控制,通信協議控制。而基於內存表的通信建立在堅實的c/s數據庫服務器上。在更高層解決了很多網絡通信問,你只要關注於通信協議的業務邏輯。當需要傳輸二進制大數據時,其實我們可以在基於內存表的通信基礎上,讓服務器再通過scoket把二進制傳入。在局域網c/s框架下,你可以通過權限控制,動態建立內存表,來完成用戶交互。
 
(四)、構建分布式系統
 
  當你的系統遇到高並發,高流量時,你需要構建分布式,可水平擴展的業務系統。而你的多個業務系統如果共享數據是一大難題.內存表可以解決這個問題,速度是建立在內存中,通信是建立高性能數據庫c/s模式上,你只要專注於業務邏輯。
 
(五)、構建跨語言跨平台通信
 
  通用數據庫系統,在各大流行語言中都可以訪問。通過數據庫表通信,以前遇到的問題是通信速度太慢,而基於內存模式,解決了通信慢的問題,好處在於使各種語言通過標准sql訪問通信內容。可以基於這種方式,實現c#和java在局域網通信,解決通信協議問題。通過orm方式,完全實現對象和list<t>在不同系統的穿梭,避免重復發明輪子。對於小並發量局域網通信完全夠用。對於大並發,見問答。
 
  內存表在上面系統中,類似於設計模式中的中介者模式。中介者模式的特點是,用一個中介對象封閉一系列的對象交互,各個對象不需要相互作用,使其耦合松散,從而獨立改變它們之間的交互。
 
四、內存表問答:
 
(一)、如何做到數據庫的全內存操作,不要經過老牛般的硬盤?
 
  你可以把數據庫安裝在“內存硬盤”中,“內存硬盤”是用內存虛擬硬盤,這樣數據庫在讀取諸如用戶權限、配置信息時,也是從內存加載,有效克服最后的瓶頸。至於“內存硬盤”如果和硬盤同步,也有解決方案。
 
(二)、基於內存表通信的速度有我自行開發的socket快嗎?
 
  如果兩台電腦通過socket對連,內存表通信肯定沒有socket快,但也慢不到那里去,因為都在內存操作。內存表只是一個中介者,有了這個中介者會帶來很多好處,如訪問容易,就像在不同電腦之間加入路由器一樣。
 
(三)、基於內存表的緩存系統怎么在現有系統上集成?
 
  你可以把“需要緩存”、不常執行新增刪除修改的表,改為內存表。把原來的數據表,改個名字,系統啟動時,用程序把數據表插入內存表。這樣代碼和sql做到最少改動。原數據表的新增刪除修改部分代碼,增加"改名后的數據表"操作部分。
    
  極少更新的表,可以不修改現有任何代碼,建立一個伺服程序,過段時間把數據表同步到內存表中(操作最好帶事務,不然讀”內存表“程序可能出現數據出錯),當然時間間隔你可以根據情況自行調整。
 
(四)、大家都知道數據庫連接數是有限的,如果用內存表通信支持高並發?
 
  對於高並發,內存數據庫的並發量高於基於硬盤的並發量。這時任何基於傳統數據庫驅動的程序會感到更吃力,因為傳統數據庫有i/o的瓶頸。這時你只要使用傳統分流數據庫並發方式來操作就可以了,如物理分庫, 數據庫集群、負載均衡、路由選擇庫表散列。另外你可以使用高效率c/c++來接收通信,把收到內容放入隊列,隊列程序再放入內存表,使用java/c#擅長邏輯處理的程序從內存表中取出做業務邏輯處理,處理完后的結果放在內存表,隊列程序從內存表中取出到發送隊列,c/c++從發送隊列發送給客戶端。
 
五、測試圖
 
  下圖為使用內存表測試結果,其中testGetEntitiesByArray(),測試了一萬條數據庫事務處理。不處理數據庫時測試平均為2s,使用數據庫為5s,內存表用了3s。
 
  下圖為使用基於硬盤數據庫表測試結果,其中testGetEntitiesByArray(),測試了一萬條數據庫事務處理。不處理數據庫時測試平均為2s,使用數據庫為50s,硬盤數據庫表用了48s。兩者相差48/3=16倍。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM