簡單快取設計

2021-05-24 00:34:12 字數 1065 閱讀 2378

在專案開發中,快取起到至關重要的作用,它能加快程式執行的速度,提高程式效能。按照快取是否備份到磁碟中,可將快取分為兩種:只在記憶體中執行,斷電後消失;與磁碟中的檔案進行交換,下次啟動時能從檔案中恢復。筆者在實際中用到了幾種快取,下面簡單總結。

1,堆疊式快取。這種快取適合儲存大小一致的資料塊。初始化時首先獲得乙個大的記憶體區域,均分為若干小塊。兩個單向鍊錶,即空閒鍊錶和資料鏈表。開始空閒鍊錶指向記憶體塊,資料鏈表為空。當要寫資料時,先從空閒鍊錶中獲取乙個空閒塊,新增到資料鏈表中。如果當前空閒鍊錶為空,從資料鏈表中取一定數量的塊寫入到檔案中,釋放這些塊到空閒鍊錶中。要讀取資料時,直接從資料鏈表中獲取乙個塊。如果資料鏈表為空,則從檔案中載入乙個資料塊。如果管理的快取內容很大,可以用乙個檔案管理器管理多個快取檔案。這種快取的主要缺點是不支援重複遍歷操作。因為資料讀取後,下次就不能再讀取相同記錄了。

2,僅支援遍歷的快取。這種快取首先分配一大塊記憶體,再劃分為若干小塊。用乙個檔案儲存所有的快取記錄,用兩個整數記錄快取儲存的內容在檔案中起始位址和快取內容的大小。遍歷時,先盡可能讀取大的一塊到記憶體中,然後在記憶體中移動遍歷指標。為了加快預讀,可將檔案對映的程序位址空間中。這種快取隨機訪問的效率比較低。

3,支援隨機訪問的快取。這種快取要用到hash結構。c++中map模板也可以勝任。首先定義乙個包裝結構:

可以構建乙個支援lru演算法的map結構

maplru_cache;

該map的鍵是快取塊的編號,值包含快取資料。乙個雙向鍊錶連線了所有的快取塊,如果訪問的資料塊命中快取,則該塊被提公升到鍊錶的頭部。如果快取不夠,在尾部的快取將被換出。其中,wrap_struct 結構還可以新增其他成員,如標識,以標明某個塊必須一直在記憶體中。

4,混合快取。這種快取包含了僅支援遍歷的快取和支援隨機訪問的快取結構。使用者可以調整兩種快取的大小,以適應不同的使用環境。

5,基於頁的快取。這種快取適合儲存記錄大小不規則,且平均長度不大的資料。快取包含3種頁,即滿頁,半滿頁和空閒頁。半滿頁用雙向鍊錶連線起來。每個頁可以儲存若干條記錄。所有記錄用lru演算法進行排程。處理較為複雜,但是效率和空間利用率都很高,適合處理大量的不規則小資料。

以上只是簡單的快取設計方法,其他更複雜的方法這裡就不介紹了。僅作拍磚。。

快取設計 快取誤用

服務1和服務2約定好key和value,通過快取傳遞資料 服務1將資料寫入快取,服務2從快取讀取資料,達到兩個服務通訊的目的。存在問題 資料管道,資料通知場景,mq更加合適 思想是讓專業的軟體幹專業的事情,nginx做反向 db做固話,cache做快取,mq做通道 多個服務關聯同乙個快取例項,會導致...

簡單利用Memcached進行快取層設計

正在考慮web應用快取層的設計,參考了不少資料,估計還是需要用到相對成熟應用廣泛的分布式快取memcached。在.net平台上早就有相對成熟的memcached客戶端產品,如beitmemcached和enyimmemcached,業餘時間看了一下原始碼,自己分析並呼叫一下並不困難。這裡簡單介紹一...

快取簡單實現

時間和次數觸發更新 有快取雪崩的情況,更新有更新鎖,還是有點併發問題,不適用於高併發,不嚴謹,簡單實現.有乙個更新就可以了,不要都更新 切記 獲取鎖後在finally裡釋放該鎖!否則將導致無法獲取到鎖來更新快取。如果重新整理時間小於1小時且訪問次數小於100且已經重新整理完成可以直接從快取中取,否則...