a) 資料庫結構不合適。由於需求要求每個使用者只能查詢自己能查的公文,但標識乙個公文可以被哪個公司、部門或個人可查的字段,卻不存在,必須使用like語句來匹配,極大的增大了表的掃瞄範圍,增大了資料庫io、記憶體開銷,降低了查詢速度。
b) 查詢結果集取出全部資料,直接導致資料庫io、記憶體、網路資源增加。同時由於在webservice層建立完所有物件後,再進行分頁,然後取出指定乙個頁面的結果集返回,使資料流的使用效率幾乎為0。
memcached是由danga interactive開發的,高效能的,分布式的記憶體物件快取系統,用於在動態應用中減少資料庫負載,提公升訪問速度。memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數量的開啟鏈結,使用非阻塞的網路i/o,對內部物件實現引用計數(因此,針對多樣的客戶端,物件可以處在多樣的狀態), 使用自己的頁塊分配器和雜湊表, 因此虛擬記憶體不會產生碎片並且虛擬記憶體分配的時間複雜度可以保證為o(1).。
memcached的快取是一種分布式的,可以讓不同主機上的多個使用者同時訪問, 因此解決了共享記憶體只能單機應用的侷限,更不會出現使用資料庫做類似事情的時,磁碟開銷和阻塞的發生。
所以,如果有多台計算機需要快取相同的東西,才需要使用分布式快取。
memcached使用了同樣的「key=>value」方式組織資料。同時不提供key的列舉操作,只能使用相同的資料key生成規則來生成訪問指定value的key。
memcached採用了一種"懶過期"的策略,這種策略不消耗額外的cpu時間去專門處理過期的item。當乙個item被請求(get命令)時,memcached會檢查這個item的過期時間;如果已經過期,這個item將不會被返回給客戶端。
同樣,向cache中新增乙個item時,如果cache已經滿了,memcached首先替換已經過期的條目,然後替換最近未使用的item(the least used item, lru淘汰演算法)。
現實狀況中,由於已經對05、06、07、08、09年的公文進行歸檔,所以歸檔資料庫中含有歷年資料。如果進行資料庫結構調優,所以風險大收效小,所以暫不進行優化。
目前已經實現使用memcached對查詢的結果集進行快取,以加速翻頁效率。
l 序列優化
在結果集快取方案中,主要步驟及用時權值為:
序號
步驟名稱
時間複雜度
依賴1
快取主鍵生成
2查詢快取
3資料庫查詢
4資料庫網路io
5生成分頁
6快取分頁
可以看出,資料庫查詢最慢,其次是把分頁後的記錄快取到memcached次之。
圖一:首次查詢序列
圖二:以後分頁序列
從圖一可以看出,從於極多數的首次查詢,由於都是取第一頁資料,所以對於資料庫網路io和分頁的時間,只佔少數百分比。如果第一次查詢,便是最後一頁資料,則快取分頁所佔的時間開銷也不會參與計算。
l 設計介面
為了完成上述的序列邏輯,進行了比較繁複的**設計。為了以後可以對類似的查詢進行復用,資料層針對idatareader介面進行設計,其它的操作封裝在searchresult類(負責從idatareader取得記錄並生成物件)和memcachedresult類(負責快取查詢,分頁,快取結果集等操作),這裡不再詳述。
資訊科技部 管理資訊化中心 牛昆亮
二○一○年二月二十五日
附類圖:
分布式快取
分布式快取 原則來說跟應用伺服器分布式應該是一樣,但快取是有狀態的。怎麼樣提高命中?1.最原始的演算法 那就是key hash取模,取到伺服器ip。在大量伺服器伸縮行有問題,加入一台伺服器就有可能讓所有的快取都失效。如 key hash 後是100,取10膜是0,取11膜 1,101 取10膜是1,...
分布式快取
網際網路發展的同時,也引領者相關技術的發展與變革,比如集群 高併發 負載均衡 高可用 海量資料的處理 系統安全 分布式快取等各方面的相關技術。簡單談一下分布式快取技術。2 三層架構 1 web層 表現層 主要對使用者資料接收,以及資料處理完成後返回,為客戶端提 用程式的訪問 2 應用層 對業務的處理...
分布式快取
分布式快取 1 什麼是分布式快取?在高併發的環境下,大量的i o處理與cpu的處理速度顯然不在同乙個數量級,從減輕資料庫的壓力和提高系統的響應速度兩個角度來考慮,因而都會在資料庫之前加一層快取。由於單機的記憶體資源和承載能力有限,因而可以採用多台伺服器來用作快取,使得多台快取伺服器形同一台,並且不會...