資料緩衝方案,緩衝方案
資料緩衝方案by 伍雪穎
今天考慮一個適合自己項目的緩衝方案,基本都實驗了下(以前一直用CoreData)1.coredata,用MagicalRecord+Mogenerator要建表,還要寫好多解析代碼,果斷不用,好麻煩2.序列化
[NSKeyedArchiver archiveRootObject:model toFile:path];
[NSKeyedUnarchiver unarchiveObjectWithFile:path];
好方便,不過總感覺體驗不好,測了下方法時間,當model量大後解析時間基本在200ms以上了,放棄使用3.sqllite用了前期唐巧推薦的一個開源鍵值庫,用起來好方便
[[WTUtilsshared].dbclearTable:@"RestList"];
[[WTUtilsshared].dbputObject:responsewithId:@"restList"intoTable:@"RestList"];
再結合今天看的Mantle
- (void)loadSavedData { dispatch_async(dispatch_get_global_queue(0, 0), ^{ id data = [[WTUtils shared].db getObjectById:@"restList" fromTable:@"RestList"]; restListArray = [WTRestListEntity getRestListArray:data]; if (restListArray != nil) { DELAYEXECUTE(0.0, [_tableView reloadData]); }else { [ZAActivityBar showWithStatus:@"loading..."]; } });}最後緩衝效果不錯,代碼操作簡單,可操作性好.
網路中的緩衝是什?
CPU緩衝(Cache Memory)位於CPU與記憶體之間的臨時儲存空間,它的容量比記憶體小但交換速度快。在緩衝中的資料是記憶體中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量資料時,就可避開記憶體直接從緩衝中調用,從而加快讀取速度。由此可見,在CPU中加入緩衝是一種高效的解決方案,這樣整個記憶體儲器(緩衝+記憶體)就變成了既有緩衝的高速度,又有記憶體的大容量的儲存系統了。緩衝對CPU的效能影響很大,主要是因為CPU的資料交換順序和CPU與緩衝間的頻寬引起的。
緩衝是為瞭解決CPU速度和記憶體速度的速度差異問題。記憶體中被CPU訪問最頻繁的資料和指令被複製入CPU中的緩衝,這樣CPU就可以不經常到象“蝸牛”一樣慢的記憶體中去取資料了,CPU只要到緩衝中去取就行了,而緩衝的速度要比記憶體快很多。
這裡要特別指出的是:
1.因為緩衝只是記憶體中少部分資料的複製品,所以CPU到緩衝中尋找資料時,也會出現找不到的情況(因為這些資料沒有從記憶體複製到緩衝中去),這時CPU還是會到記憶體中去找資料,這樣系統的速度就慢下來了,不過CPU會把這些資料複製到緩衝中去,以便下一次不要再到記憶體中去取。
2.因為隨著時間的變化,被訪問得最頻繁的資料不是一成不變的,也就是說,剛才還不頻繁的資料,此時已經需要被頻繁的訪問,剛才還是最頻繁的資料,現在又不頻繁了,所以說緩衝中的資料要經常按照一定的演算法來更換,這樣才能保證緩衝中的資料是被訪問最頻繁的。
緩衝的工作原理
[編輯本段]
緩衝的工作原理是當CPU要讀取一個資料時,首先從緩衝中尋找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從記憶體中讀取並送給CPU處理,同時把這個資料所在的資料區塊調入緩衝中,可以使得以後對整塊資料的讀取都從緩衝中進行,不必再調用記憶體。
正是這樣的讀取機制使CPU讀取緩衝的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的資料90%都在緩衝中,只有大約10%需要從記憶體讀取。這大大節省了CPU直接讀取記憶體的時間,也使CPU讀取資料時基本無需等待。總的來說,CPU讀取資料的順序是先緩衝後記憶體。
一級緩衝和二級緩衝
[編輯本段]
為了分清這兩個概念,我們先瞭解一下RAM 。RAM和ROM相對的,RAM是掉電以後,其中的資訊就消失那一種,ROM在掉電以後資訊也不會消失那一種。
RAM又分兩種,一種是靜態RAM,SRAM;一種是動態RAM,DRAM。前者的儲存速度要比後者快得多,我們現在使用的記憶體一般都是動態RAM。
有的菜鳥就說了,為了增加系統的速度,把緩衝擴大不就行了嗎,擴大的越大,緩衝的資料越多,系統不就越快了嗎?緩衝通常都是靜態RAM,速度是非常的快, 但是靜態RAM整合度低(儲存相同的資料,靜態RAM的體積是動態RAM的6倍), 價格高(同容量的靜態RAM是動態RAM的四倍), 由此可見,擴大靜態RAM作為緩衝是一個非常愚蠢的行為, 但是為了提高系統的效能和速度,我們必須要擴大緩衝, 這樣就有了一個折中的方法,不擴大原來的靜態RAM緩衝,而是增加一些高速動態RAM做為緩衝, 這些高速動態RAM速度要比常規動態RAM快,但比原來的靜態RAM緩衝慢, 我們把原來的靜態ram緩衝叫一級緩衝,而把後來增加的動態RAM叫二級緩衝。
一級緩衝和二級緩衝中的內容都是記憶體中訪問頻率高的資料的複製品(映射),它們的存在都是為了減少高速CPU對慢速記憶體的訪問。 通常CPU找資料或指令的順序是:先到一級緩衝中找,找不到再到二級緩衝中找,如果還找不到就只有到內......餘下全文>>
hibernate的緩衝機制是用什方法實現的
緩衝是介於應用程式和物理資料來源之間,其作用是為了降低應用程式對物理資料來源訪問的頻次,從而提高了應用的運行效能。緩衝內的資料是對物理資料來源中的資料的複製,應用程式在運行時從緩衝讀寫資料,在特定的時刻或事件會同步緩衝和物理資料來源的資料。
緩衝的介質一般是記憶體,所以讀寫速度很快。但如果緩衝中存放的資料量非常大時,也會用硬碟作為緩衝介質。緩衝的實現不僅僅要考慮儲存的介質,還要考慮到管理緩衝的並發訪問和快取資料的生命週期。
Hibernate的緩衝包括Session的緩衝和SessionFactory的緩衝,其中SessionFactory的緩衝又可以分為兩類:內建緩衝和外置緩衝。Session的緩衝是內建的,不能被卸載,也被稱為Hibernate的第一級緩衝。SessionFactory的內建緩衝和Session的緩衝在實現方式上比較相似,前者是SessionFactory對象的一些集合屬性包含的資料,後者是指Session的一些集合屬性包含的資料。SessionFactory的內建緩衝中存放了映射中繼資料和預定義SQL語句,映射中繼資料是對應檔中資料的拷貝,而預定義SQL語句是在Hibernate初始化階段根據映射中繼資料推匯出來,SessionFactory的內建緩衝是唯讀,應用程式不能修改緩衝中的映射中繼資料和預定義SQL語句,因此SessionFactory不需要進行內建緩衝與對應檔的同步。SessionFactory的外置緩衝是一個可配置的外掛程式。在預設情況下,SessionFactory不會啟用這個外掛程式。外置緩衝的資料是資料庫資料的拷貝,外置緩衝的介質可以是記憶體或者硬碟。SessionFactory的外置緩衝也被稱為Hibernate的第二級緩衝。
Hibernate的這兩級緩衝都位於持久化層,存放的都是資料庫資料的拷貝,那麼它們之間的區別是什麼呢?為了理解二者的區別,需要深入理解持久化層的緩衝的兩個特性:緩衝的範圍和緩衝的並發存取原則。
持久化層的緩衝的範圍
緩衝的範圍決定了緩衝的生命週期以及可以被誰訪問。緩衝的範圍分為三類。
1 事務範圍:緩衝只能被當前事務訪問。緩衝的生命週期依賴於事務的生命週期,當事務結束時,緩衝也就結束生命週期。在此範圍下,緩衝的介質是記憶體。事務可以是資料庫事務或者應用事務,每個事務都有獨自的緩衝,緩衝內的資料通常採用相互關聯的的對象形式。
2 進程範圍:緩衝被進程內的所有事務共用。這些事務有可能是並發訪問緩衝,因此必須對緩衝採取必要的事務隔離機制。緩衝的生命週期依賴於進程的生命週期,進程結束時,緩衝也就結束了生命週期。進程範圍的緩衝可能會存放大量的資料,所以存放的介質可以是記憶體或硬碟。緩衝內的資料既可以是相互關聯的對象形式也可以是對象的鬆散資料形式。鬆散的對象資料形式有點類似於對象的序列化資料,但是對象分解為鬆散的演算法比對象序列化的演算法要求更快。
3 叢集範圍:在叢集環境中,緩衝被一個機器或者多個機器的進程共用。緩衝中的資料被複製到叢集環境中的每個進程節點,進程間通過遠程通訊來保證緩衝中的資料的一致性,緩衝中的資料通常採用對象的鬆散資料形式。
對大多數應用來說,應該謹慎地考慮是否需要使用叢集範圍的緩衝,因為訪問的速度不一定會比直接存取資料庫資料的速度快多少。
持久化層可以提供多種範圍的緩衝。如果在事務範圍的緩衝中沒有查到相應的資料,還可以到進程範圍或叢集範圍的緩衝內查詢,如果還是沒有查到,那麼只有到資料庫中查詢。事務範圍的緩衝是持久化層的第一級緩衝,通常它是必需的......餘下全文>>