標籤:
ETS和進程字典都是Erlang所專屬的。
ETS是Erlang Term Storage 的縮寫,它是一個基於記憶體的KV( Key Value) Table,支援大資料量儲存以及高效查詢。
要使用ETS表,首先就要先建立ETS表。
1.ets:new(?ETS_SYS_BUILDING,[{keypos,#ets_sys_building.sysBuildingId},named_table,public,set])其中?ETS_SYS_BUILDING:是表名{keypos,#ets_sys_building.sysBuilding}:將key設定為#ets_sys_building.sysBuildingId (可以省略)注意:ets表是基於KV的,也就是key value即key -->{key,value},其中value是一個元組,而key預設為value的第一個元素,現在將key設為#ets_sys_building.sysBuildingId,從key可以看出,這個ets表的value是一個以ets_sys_building為開頭的元組,所以要想知道ets表的value,可以看ets_sys_building記錄的定義。表名和value沒有必要的聯絡,但為了操作方便,一般會把表名和記錄名用作同一個名字。named_table:若指定了named_table這個屬性,就可以使用表名(也就是new函數的第一個參數Name)對錶進行操作,而無需使用TableId。public:指 定table的存取權限,若是public表示所有process都可以對該table進行讀寫(只要你知道TableId或者 TableName),private表示只有建立表的process才能對table進行讀寫,而protected則表示所有的process都可以 對錶進行讀取,但是只有建立表的process能夠對錶進行寫操作(可以省略,預設為protected)。set:指定建立的table類型 2.ets:insert(Tab,ObjectOrObjects) -> true向 ETS 表 Tab 插入一個對象資料或者一個對象列表資料 ObjectOrObjects。 如果表是一個 set 類型的表,並且插入的對象資料的鍵在表裡可以匹配得到資料,那麼舊的對象資料將會被替換。 如果表是一個 ordered_set 類型的表,並且在表裡有跟插入的對象資料有相同的鍵,那麼舊的對象資料將會被替換。 如果插入的對象列表資料裡存在多個相同鍵的情況,並且表是一個 set 類型的表,那麼只有一個對象資料可以被插入,不過不確定是哪一個。對於 ordered_set 類型的表,如果鍵一樣時,操作的情況像上面一樣。 整個操作都保持著原子性和獨立性,即使有多個對象資料插入的情況。 3.ets:tab2list(Tab) -> [Object]返回一個ETS表的所有對象資料的列表。 4.ets:lookup(Tab,Key) -> [Object]
返回表 Tab 裡鍵為 Key 的所有對象資料的列表,注意,這裡一定要用key進行匹配,不能用其他的欄位。
在類型是 set、bag、duplicate_bag 表裡,只有跟鍵 Key 相匹配的對象資料才會返回。如果是 ordered_set 類型的表的話,就只有跟鍵相等的情況下才會返回。這兩者的區別就像 =:= 跟 == 一樣。
如果是 set 或 ordered_set 類型的表,那麼該函數會返回一個空列表或者一個元素的列表,因為這些類型的表裡不可能存在多個相同鍵的對象資料。如果是 bag 或 duplicate_bag 類型的表,那麼該函數則返回任意長度的列表。
資料插入的順序是有儲存的,第一筆插入的資料,返回的時候也是排在第一位。
在類型是 set、bag、duplicate_bag 表裡,插入和尋找的時間是恒定的,跟表的大小無關。對於 ordered_set 類型的表,插入和尋找的時間跟表的大小成正比。 5.ets:fun2ms(LiteralFun) -> MatchSpec使用一個解析轉換的仿函數 ListeralFun 作為參數傳遞給該函數轉換出一個匹配規範。"literal" 意味著函數必須以文本的形式作為函數的參數,它不能是依次傳遞給函數的變數。匹配規範解析轉換是在 ms_transform 模組裡實現,源碼裡必須引入標準庫(STDLIB)裡的 "ms_transform.hrl" 的標頭檔才能使仿函數正常使用。源碼裡引入標頭檔失敗的話,會報一個執行階段錯誤,而不是一個編譯時間錯誤。包函此檔案很簡單,只要在代碼檔案裡添加下面一行就行: -include_lib("stdlib/include/ms_transform.hrl").偽函數 LiteralFun 的有很嚴格的限制條件,它只提供一個的參數(用於匹配的對象):一個單一的變數或一個元組。而且必須使用像 is_XXX 類似的斷言檢測。例如:if、case、receive 之類的文法結果是不允許出現在匹配規範中的。 函數返回的值就是一個匹配規範。Erlang 內建的函數可以被匹配規範函數調用。 6.ets:select(Tab, MatchSpec) -> [Match]使用一個匹配描述從表 Tab 裡匹配對象。 ets:fun2ms函數和ets:select函數一般會一起使用,例如:get_sys_award_info(SysActiveId) -> MS = ets:fun2ms(fun(T) when (T#ets_sys_activity_award.sysActivityId == SysActiveId) -> T end), ets:select(?ETS_SYS_ACTIVITY_AWARD, MS). 7.ets:i(Tab) -> ‘ok‘ :在輸出端上列印顯示指定ETS表的Tab資訊ets:i() -> ‘ok‘ :在輸出端上列印顯示所有ETS表的資訊 8.ets: delete_all_objects(Tab) -> true刪除表 Tab 裡的所有對象資料。該操作會保持資料的原子性(atomic)和獨立性(isolated)。
Erlang --- ETS表