緩存

来源:http://www.cnblogs.com/hvicen/archive/2016/12/10/6146154.html
-Advertisement-
Play Games

緩存的意思是中間存儲,相當於中轉站,積累一定的貨物,再往目的地運送。如果沒有中轉站,就會出現一件一件的運送,耗費大量的人力物力。 緩存的基類是:Buffer 緩存的基本子類有:Char/Byte/Short/Int/Long/Float/Double + Buffer 緩存一般用一個數組做存儲,ar ...


緩存的意思是中間存儲,相當於中轉站,積累一定的貨物,再往目的地運送。如果沒有中轉站,就會出現一件一件的運送,耗費大量的人力物力。

緩存的基類是:Buffer

緩存的基本子類有:Char/Byte/Short/Int/Long/Float/Double + Buffer

 

緩存一般用一個數組做存儲,array()方法可以獲取這個數組,但並不是所有Buffer都能夠獲取這個數組,使用hasArray()方法的返回值,查看Buffer是否能獲取數組。有兩種情況,Buffer是不能獲取數組。

第一種情況,直接存儲的Buffer:使用new創建一個數組,這個數組使用的存儲空間是堆空間,如果使用JIN,然後直接從記憶體中開闢空間,這樣就可以節省堆空間,解決一些堆空間不足的情況。因此,Buffer分堆存儲,和直接存儲。堆存儲的Buffer使用allocate(int)靜態方法創建,直接存儲的Buffer使用allocateDirect(int)靜態方法創建,wrap(...)靜態方法是自己提供一個數組來創建Buffer,自己提供的數組肯定是屬於堆空間上的。使用isDirect()方法,可以查看Buffer是否為直接儲存,否則為堆存儲。

第二種情況,只讀模式的Buffer:緩存的基本操作就是讀和寫,使用get()方法進行讀取操作,使用put()方法進行寫入操作。Buffer創建的時候,既可以讀,也可以寫。有一種需求,Buffer需要提供給其它操作者,但只能讀,不能寫。使用asReadOnlyBuffer()方法就能創建出一個只讀Buffer,這個只讀Buffer與原Buffer是共用同一個數組,共用數組可以達到節省空間的目的。因此,為了不讓操作者進行寫操作,只讀模式的Buffer就不允許操作者獲得裡面的數組。使用isReadOnly()方法,查看Buffer是否只讀。

 

緩存在讀取和寫入數組單元時,其操作位與實際操作位會有偏差,使用arrayOffset()方法,可以獲得這個偏差量。以下方法的參數和返回值,都是相對於偏差量的。

  • 當前操作位:position()/position(int)
  • 操作結束位:limit()/limit(int)
  • 操作結束位的最大值:capacity()

每次操作完後,當前操作位就會指向下一個數組單元。一直到操作結束位時,緩存就不允許再操作。通過limit()-position(),也可以使用remaining()方法,查看剩餘操作量。使用hasRemaining()方法,查看是否還能操作。

當前操作位與操作結束位可以通過position(int)和limit(int)方法單獨調整,也可以通過其它方法進行整體調整。

  • clear()方法,調整position為0,limit為capacity,表示清除已有數據,等待寫入數據。
  • flip()方法,調整limi為position,position為0,表示寫數據完畢,等待讀取數據。
  • rewind()方法,調整position為0,表示重新寫入或重新讀取數據。
  • reset()方法,調整position為回檔位,表示操作從回檔位開始。回檔位是需要事先使用mark()方法標記當前操作位為回檔位,回檔位不能大於當接操作位,否則在調整過程中,回檔位被消除。
  • compact()方法,把未讀數據複製至開始位置,調整position為剩餘量,調整limit為capacity,表示清除已讀數據,保留未讀數據,並等待寫入數據。

(註:圖源於http://www.cnblogs.com/hvicen/p/6138690.html)

該圖表示出Buffer在寫與讀的時候,limit所處的位置,左邊是寫模式,右邊是讀模式。使用flip()方法,使寫模式轉變為讀模式。使用clear()和compact()方法,使讀模式轉變為寫模式,clear()是清空所有數據,compact()只清除已讀數據,保留未讀數據。

 

使用duplicate()方法,拷貝出一個屬性和狀態一致的Buffer,兩個Buffer是共用數組。

使用slice()方法,構建出一個Buffer,這個Buffer以當前操作位的實際操作位為偏差量,以剩餘操作量為操作結束位的最大值。換句話說,slice的意思是切片,切出一個從當前操作位到操作結束位的Buffer,這個Buffer的讀與寫只能在這一段上面進行,同樣切出來的Buffer與原Buffer是共用數組。

一個數據單元可以切分成多個位元組,例如一個整型數據可以切分成四個位元組,存儲在數組時,可以從高位到低位存儲,也可以從低位到高位存儲。使用order()/order(ByteOrder)方法,可以查看和設置一個數據單元的排列方式,低位到高位排列為ByteOrder.BIG_ENDIAN,高位到低位排列為ByteOrder.LITTLE_ENDIAN。使用ByteOrder.nativeOrder()方法,查看本地的數據排列方式。

 

本文原創,待續更新!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好久沒寫博客了,今天特地來更新一下,今天我們要學習的是如何導出數據到Excel文件中,這裡我使用的是免費開源的Epplus組件。 源代碼下載:https://github.com/caofangsheng93/ExcelExportInMvc 介紹 這篇文章,介紹的是怎樣導出數據到Excel文件中, ...
  • 問題的提出 昨天在qq群問了一個linq的問題被人鄙視了。題目大概類似於 問from...in...select...中in後面如果接的不是集合,而是一個delegate,會怎麼樣??之後就被人鄙視了,一些人嘲笑我工作年頭是混出來的,in後面當然是數據源了,delegate也可以作為數據源,所以當然 ...
  • 本文版權歸博客園和作者吳雙本人共同所有,轉載和爬蟲請註明原文地址 www.cnblogs.com/tdws 寫在前面 OOM顧名思義,Object-Object-Mapping實體間相互轉換,AutoMapper也是個老生常談了,其意義在於幫助你無需手動的轉換簡單而又麻煩的實體間關係,比如ViewM ...
  • Matlab7.0安裝完成後打開就立即關閉,此時右鍵點擊MATLAB7.0快捷方式-“用圖形處理器運行”-“更改預設圖形處理器”,將“集成圖形”設置成預設: 點擊MATLAB7.0快捷方式將顯示: 然後將視窗關閉,在桌面找到MATLAB快捷方式將游標移動到該快捷方式,右鍵查看該快捷方式的“相容性”, ...
  • Error occurred computing Git commit diffsMissing unknown 0000000000000000000000000000000000000000 commit操作時,出現如上錯誤 ...
  • Java里的攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器... ...
  • ...
  • 前段時間寫了幾個PHP的腳本,但是因為腳本的項目是基於composer安裝的,給別人使用的時候不太方便,就希望能夠打包成一個能直接使用的文件。 搜索了一下,發現可以使用phar打包。 假設我們有如下一個項目 入口文件是index.php,打包前的命令如下: 再添加打包腳本之前,需要先修改一下PHP的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...