最經常使用函數:
new(Name, Options) -> tid() | atom()
新建一個表名爲Name的ETS表,並返回表的一個標識符。
Types:
Name = atom()
Options = [Option]
Option = Type | Access | named_table | {keypos,Pos} | {heir,pid(),HeirData} | {heir,none} | Tweaks
Type = set | ordered_set | bag | duplicate_bag
Access = public | protected | private
Tweaks = {write_concurrency,boolean()} | {read_concurrency,boolean()} | compressed
Pos = integer()
HeirData = term()
tab2list(Tab) -> [Object]
返回一個ETS表的全部對象數據的列表
Types:
Tab = tab()
Object = tuple()
增/插入:
insert(Tab, ObjectOrObjects) -> true
向ETS表Tab中插入一個或一個對象列表數據ObjectOrObjects
若是是set類型和orderen_set類型的表,插入的數據和表裏的數據有相同的鍵值,則舊數據會被替換
insert_new(Tab, ObjectOrObjects) -> boolean()
與insert/2相似,但當插入的對象是一個列表,則在插入數據前,將檢測列表裏的每個鍵,若是有和表中鍵值相同的則不插入任何數據對象。
刪/刪除:
delete(Tab) -> true
Types:
Tab = atom() |tid()
刪除整個Tab表
delete(Tab, Key) -> true
Types:
Tab = atom() | tid()
Key = trem()
從Tab表中刪除全部以Key爲鍵的對象
例子:
Tab = ets:new(test_ets_new, [set, named_table]),
ets:insert(Tab, [{a, 1, 1}, {b, 2, 2}]),
ets:delete(Tab,c).
結果:true
爲了確認是否已經刪除咱們能夠執行ets:tab2list(Tab). 能夠看到返回結果是 :[{b,2,2}] 說明確實已經刪除了。
delete_all_objects(Tab) -> true
Types:
Tab = atom() | tid()
刪除Tab中的全部對象,該操做會保持數據的原子性和獨立性
delete_object(Tab, Object) -> true
刪除與Object精確匹配的對象,只有鍵值相同,但其餘有不匹配的對象不會被刪除(這對於Bag類型的表很是有用,在duplicate_bag表中,全部匹配的對象都會被刪除)。
例子1:
TableId = ets:new(test_ets_new, [named_table, bag]),
ets:insert(TableId, [{a, 1}, {b, 2}, {a, 3}, {c, 4}]),
ets:delete_object(TableId, {a, 3}),
ets:tab2list(TableId).
結果: [{c,4},{b,2},{a,1}]
例子2:
TableId = ets:new(test_ets_new, [named_table, duplicate_bag]),
ets:insert(TableId, [{a, 3}, {b, 2}, {a, 3}, {c, 4}]),
ets:delete_object(TableId, {a, 3}),
ets:tab2list(TableId).
結果:[{c,4},{b,2}]
修改/更新
update_element(Tab, Key, ElementSpec :: {Pos, Value}) -> boolean()
update_element(Tab, Key, ElementSpec :: [{Pos, Value}]) -> boolean()
更新ETS表Tab裏鍵爲Key的對象數據的第Pos個元素數據的值更改成Value。可一次更改一個鍵的多個Pos
Types:
Tab = tid() | atom()
Key = Value = term()
Pos = integer()
例子:
Tab = ets:new(test_ets_new, [set, named_table]),
ets:insert(Tab, [{a, 1, 1}, {b, 2, 2}]),
ets:update_element(Tab, a, {2, 100}),
ets:tab2list(Tab).
結果:[{b,2,2},{a,100,1}]
一次修改多個位置:
Tab = ets:new(test_ets_new, [set, named_table]),
ets:insert(Tab, [{a, 1, 1}, {b, 2, 2}]),
ets:update_element(Tab, a, [{2, 100}, {3,10}]),
ets:tab2list(Tab).
結果:[{b,2,2},{a,100,10}]
查/查找
lookup(Tab, Key) -> [Object]
返回表Tab裏鍵爲Key的全部對象數據的列表
若是是ordered_set則鍵1.0 與 1相等。
例子1:
ets:new(test_ets_new, [set, named_table]),
ets:insert(test_ets_new, [{a, 1}, {b, 2}]),
ets:lookup(test_ets_new, a).
結果:[{a,1}]
例子2:
ets:new(test_ets_new, [ordered_set, named_table]),
ets:insert(test_ets_new, [{1, 1}, {2, 2}]),
ets:lookup(test_ets_new, 2.0).
結果:[{2,2}]
例子3:
TabId = ets:new(test_ets_new, [duplicate_bag, named_table]),
ets:insert(TabId, [{a, 1}, {b, 2}, {a, 3}]),
ets:lookup(TabId, a).
結果: [{a,1},{a,3}]
lookup_element(Tab, Key, Pos) -> Elem
若是表的類型是 set 或 ordered_set,那麼該函數將返回鍵爲 Key 的對象的第 Pos 個元素。
若是表的類型是 bag 或 duplicate_bag,那麼該函數將返回鍵爲 Key 的對象的第 Pos 個元素的列表。
若是表裏沒有鍵爲 Key 的對象,函數將以 badarg 的緣由退出。
例子1:set類型表
ets:new(test_ets_new, [set, named_table]),
ets:insert(test_ets_new, [{a, 1}, {b, 2}]),
ets:lookup_element(test_ets_new, a, 2).
結果:1
例子2:duplicate_bag類型表
ets:new(test_ets_new, [duplicate_bag, named_table]),
ets:insert(test_ets_new, [{a, 1}, {b, 2}, {a, 3}]),
ets:lookup_element(test_ets_new, a, 2).
結果:[1,3]
member(Tab, Key) -> true | false
判斷表裏是否存在指定鍵的數據
TableId = ets:new(test_ets_new, [named_table, set]),
ets:insert(TableId, [{a, 1}, {b, 2}, {c, 3}]),
ets:member(TableId, b).
結果:true
模式匹配相關函數(一樣會有增刪改查):
fun2ms(LiteralFun) -> MatchSpec
把語法函數轉爲匹配規範的僞函數
例子:
ets:fun2ms(fun({M, N}) when N > 3, is_atom(M) -> M end).
結果:[{{'$1','$2'},[{'>','$2',3},{is_atom,'$1'}],['$1']}]
查/匹配查找
select(Tab, MatchSpec) -> [Match]
使用一個匹配描述從表Tab中匹配對象。
MatchSpace是一個含有三個參數的元組元素: 第一個元素是ets:match/2的文檔中描述的模式,第二個參數是含有多個斷言測試的列表,第三個是包含關於實際返回值描述的列表。
簡單來講 第一個參數是傳入的已知變量,第二個參數是判斷條件,第三個參數是返回結果。
返回值的結構使用 MatchHead 所綁定的 "match variables",或者使用特殊的匹配值 '$_'(整個匹配對象)和 '$$'(包含全部匹配值的列表)
Types:
Tab = tid() | atom()
Match = term()
MatchSpec = match_spec()
例子1:返回值爲‘$$’
Tab = ets:new(test_ets_new, [private]),
ets:insert(Tab, [{a, 1}, {b, 2}]),
ets:select(Tab, [{{'$1', '$2'}, [], ['$$']}]).
結果:[[b,2],[a,1]]
例子2:返回值爲‘$_’
Tab = ets:new(test_ets_new, [private]),
ets:insert(Tab, [{a, 1}, {b, 2}]),
ets:select(Tab, [{{'$1', '$2'}, [], ['$_']}]).
結果:[{b,2},{a,1}]
例子3:返回MatchHead所綁定的「match variables」
Tab = ets:new(test_ets_new, [private]),
ets:insert(Tab, [{a, 1}, {b, 2}]),
ets:select(Tab, [{{'$1', '$2'}, [], ['$1']}]).
結果:[b,a]
例子4: 未弄明白爲何返回的是[2,1]
Tab = ets:new(test_ets_new, [private]),
ets:insert(Tab, [{a, 1}, {b, 2}]),
ets:select(Tab, [{{'$1', '$2'}, [], ['$1', '$2']}]).
結果:[2,1]
select(Tab, MatchSpec, Limit) -> {[Match], Continuation} | '$end_of_table'
用法和ets:select/2類似,只是返回限定數量(limit)的匹配對象數據。Continuation項能夠在後續的ets:select/1調用中獲取下一組匹配的對象數據。速度比ets:first/1 和ets:next/1逐個方位對象更快。
Types:
Tab = tid() | atom()
Match = term()
MatchSpec = match_spec()
Continuation = term()
select(Continuation) -> {[Match], Continuation} | '$end_of_table'
繼續從ets:select/3開始的匹配,下一次匹配到的限定數量Limit的對象數據將與心得Continuation一塊兒返回。心得Continuation 將會在後續調用該函數時被使用。
Types:
Match = term()
Continuation = term()
select_reverse(Tab, MatchSpec) -> [Match]
跟 ets:select/2 同樣,都是根據匹配規範匹配表裏的對象數據,不過若是是 ordered_set 類型的 ETS 表的話會返回一個倒序的列表,其餘類型的表返回的值跟 ets:select/2 同樣。
Types:
Tab = tid() | atom()
Match = term()
MatchSpec = match_spec()
select_reverse(Tab, MatchSpec, Limit) -> {[Match], Continuation} | '$end_of_table'
與select_reverse/2的關係就像 selet/2 和selet/3的關係
Types:
Tab = tid() | atom()
Match = term()
MatchSpec = match_spec()
Continuation = term()
select_reverse(Continuation) ->{[Match], Continuation} | '$end_of_table'
Types:
Match = term()
Continuation = term()
刪除
select_delete(Tab, MatchSpec) -> NumDeleted
根據匹配模式刪除表裏的對象數據
Types:
Tab = tid() | atom()
Object = tuple()
MatchSpec = match_spec()
NumMatched = integer()
不經常使用的匹配函數:
is_compiled_ms(Term) -> boolean()
檢測一個 Erlang 數據是不是一個有效已編譯的匹配規範
match(Continuation) -> {[Match], Continuation} | '$end_of_table'
match(Tab, Pattern) -> [Match]
根據匹配模式 Pattern 匹配 ETS 表 Tab 裏的對象數據。
一個匹配模式也許包含的項值有:綁定部分(Erlang 項),'_' 能夠匹配任何 Erlang 項,和匹配變量:'$N'(N>=0)
函數將返回一個匹配每一個對象數據的元素的列表,每一個元素是一個綁定變量模式的有序列表
Types:
Tab = tid() | atom()
Pattern = tuple()
Match = [term()]
match(Tab, Pattern, Limit) -> {[Match], Continuation} | '$end_of_table'
參考select/2與
Types:
Tab = tid() | atom()
Pattern = tuple()
Match = [term()]
Continuation = term()
match_delete(Tab, Pattern) -> true
根據匹配模式刪除表裏的對象數據
Types:
Tab = tab()
Pattern = match_pattern()
一些不經常使用的函數:
all() -> [Tab]
返回當前節點中全部的ets表組成的列表。若是表有命名返回表名,不然返回表的標識符
i() -> ok
在輸出端上打印顯示全部的ETS表的信息、
i(Tab) -> ok
在輸出端上打印顯示指定ETS表Tab的信息
Types:
Tab = atom() | tid()
info(Tab) -> [{Item, Value}] | undefined
返回一個以{Item, Value}元祖形式的列表的ETS表的信息。若是沒有找到表則返回undefined,若是Tab不是一個表,則返回bagarg
Tab = tid() | atom()
Item = atom(), see below
Value = term(), see below
info(Tab, Item) -> Value | undefined
返回給出的跟表Tab相關的項Item的信息。若是沒有找到表則返回undefined,若是Tab不是一個表或者Item是一個無效值,則返回bagarg
rename(Tab, Name) -> Name
給一個已命名的ETS表Tab重命名一個新的名字Name
first(Tab) -> Key | '$end_of_table'
返回ETS表Tab中的第一個對象數據的鍵
例子:
ets:new(test_ets_new, [set, named_table]),
ets:insert(test_ets_new, [{a, 1}, {b, 2}]),
ets:first(test_ets_new).
結果:a
last(Tab) -> Key | '$end_of_table'
若是類型是 ordered_set,則返回 Erlang 項順序的最後一個鍵將被返回;若是是其餘類型的表,該函數的處理跟 ets:first/1 同樣
ets:new(test_ets_new, [ordered_set, named_table]),
ets:insert(test_ets_new, [{a, 1}, {b, 2}]),
ets:last(test_ets_new).
結果:b
next(Tab, Key1) -> Key2 | '$end_of_table'
返回表裏緊隨鍵Key1的下一個鍵Key2.
除ordered_set以外的類型的表,若是有併發更新了表,遍歷將失敗,除非使用ets:safe_fixtable/2函數對錶進行保護鎖定。
prev(Tab, Key1) -> Key2 | '$end_of_table'
Types:
Tab = tid() | atom()
Key1 = Key2 = term()
返回在表裏跟鍵 Key1 緊隨的上一個鍵 Key2。若是是 ordered_set 類型的表,返回的是 Erlang 項順序的前一個鍵將被返回;若是是其餘類型的表,該函數的處理跟 ets:next/2 同樣
foldl(Function, Acc0, Tab) -> Acc1
對ETS表數據進行循環遍歷操做,規則和lists:foldl/3同樣
Types:
Function = fun((Element :: term(), AccIn) -> AccOut)
Tab = tab()
Acc0 = Acc1 = AccIn = AccOut = term()
例子:
Tab = ets:new(ets_tab, [named_table, set]),
ets:insert(Tab, [{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}]),
ets:foldl(fun({_Key, Val}, AccVal) ->
AccVal + Val
end, 0, Tab).
結果:15
foldr(Function, Acc0, Tab) -> Acc1
和ets:foldl/3同樣,對ETS表進行遍歷,區別是從表末端開始向前遍歷
Types:
Function = fun((Element :: term(), AccIn) -> AccOut)
Tab = tab()
Acc0 = Acc1 = AccIn = AccOut = term()
例子:
Tab = ets:new(ets_tab, [named_table, set]),
ets:insert(Tab, [{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}]),
ets:foldr(fun({_Key, Val}, AccVal) ->
AccVal + Val
end, 0, Tab).
結果:15
一些不多用到的函數:
safe_fixtable(Tab, Fix) -> true
Types:
Tab = tid() | atom()
Fix = boolean()
鎖定一個類型是 set,bag 或 duplicate_bag 的表,使其能夠安全遍歷表裏的數據
give_away(Tab, Pid, GiftData) -> true
讓進程Pid成爲表Tab的新的擁有者。
Types:
Tab = tid() | atom()
Pid = pid()
GiftData = term()
setopts(Tab, Opts) -> true
設置表的選項。目前能夠在表建立後設置的選項只有heir,調用進程必須是表的所屬進程。
update_counter(Tab, Key, X3 :: [UpdateOp], Default) -> [Result]
update_counter(Tab, Key, Incr) -> Result
update_counter(Tab, Key, Incr, Default) -> Result
更新ets中的數據,省去了從ets中「查找對象->更新對象數據->再插入新的對象」的過程
Types:
Tab = tid() | atom()
Key = term()
UpdateOp = {Pos,Incr} | {Pos,Incr,Threshold,SetValue}
Pos = Incr = Threshold = SetValue = Result = integer()
文件轉換爲tab
tab2file(Tab, Filename) -> ok | {error, Reason}
Types:
Tab = atom() | tid()
Filename = file:name()
Reason = term()
將Tab表導出道文件Filename,等同於table2file(Tab, Filename, [])
tab2file(Tab, Filename, Options) -> ok | {error, Reason}
Types:
Tab = atom() | tid()
Filename = file:name()
Options = [Option]
Options = {extended_info, [ExtInfo]} | {sync, boolean()}
ExtInfo = md5sum | object_count
Reason = term()
將Tab表處處導文件Filename。導表時,一些關於表的必須的信息被導到頭部,這些信息包括表的類型,名字,訪問權限,大小,版本和是不是已命名錶,同事還有關於教導文件中的一些擴展信息相關的註釋,這些可使文件中的對象數或者是頭部和文件中record的MD5值。若是標的訪問權限是public而且在導表的過程當中有田間或刪除的對象,頭部的大小字段值可能與實際的對象數不一致。public權限的表在導表時有更新,而且想在從文件中讀取表時覈對,則擴展信息中至少要有一個字段給讀取和核對進程提供依據。
擴展信息選項指出有哪些擴展信息被寫到了文件中:
object_count
實際寫入文件的對象數量寫在了文件的尾部,所以即便在導表時有更新表,也能夠覈對。
md5sum
頭部和表中的對象使用內建的MD5函數來校驗.全部對象的MD5值寫在文件的尾部,因此讀取時的校驗能夠發現文件中的數據微小的比特級的反轉。使用該選項將要耗費適量的CPU時間。
一旦使用了擴展信息選項,將致使ets版本早於stdlib-1.15.1的文件沒法讀取.
file2tab(Filename) -> {ok, Tab} | {error, Reason}
Types:
Filename = file:name()
Tab = tab()
Reason = term()
讀取一個由tab2file/2 或 tab2file/3生成的文件並建立對應的表,與file2tab(FileName, [])等效。
file2tab(Filename, Options) -> {ok, Tab} | {error, Reason}
Types:
Filename = file:name()
Tab = atom() | tid()
Options = [Option]
Option = {verify,boolean()}
Reason = term()
讀取一個由tab2file/2 或 tab2file/3生成的文件並建立對應的表。目前支持的選項只有{verify, boolean()}.若是檢驗打開(也就是設置爲{verify, true}),該函數將利用文件中的全部信息來判定數據是否被損壞,實現方式依賴於調用tab2file/3時寫入extended_info的信息。若是文件中沒有extended_info數據,但卻設置了{verify,true},寫入對象的數量將依賴於轉儲時原始表的大小。
若是在表是公共的而且在轉儲時有對象被刪除或插入,將使得檢驗失敗。爲了不這個問題,不要檢驗在轉儲的同時有更新的文件,或者在調用tab2file/3時使用{extended_info, [object_count]},這將會把實際寫入的對象數記錄到文件中。
若是開啓檢驗而且轉儲時使用{extended_info, [md5sum]}選項,在讀取文件時將會比其餘狀況慢,消耗更多的CPU時間。
Options的默認值爲{verify,false}.
tabfile_info(Filename) -> {ok, TableInfo} | {error, Reason}
返回經過tab2file/2或tab2file/3導入文件的標的信息