:ets.new(table_name, pattern)
第一個參數是表名,第二個參數是表的設置選項。
:set 一個key,一個數據,無序
:ordered_set 一個key,一個數據,有序; 1 == 1.0
:bag 一個key,多個數據, 不可重復
:duplicate_bag 一個key,多個數據,可重復
?
:public 任何進程可讀寫
:protect 擁有者進程可讀寫,其他進程可讀
:private 只有擁有者可讀寫
?
:named_table 為ets表命名,替代它的id。有該參數時 :ets.new 返回 named_table 對應的表名,使用 insert 等函數時使用。注:在使用 named_table 的情況下同一項目中不能出現 :est.new 相同的表
?
:ets.insert(table_name, object) 如果當前鍵已存在,則覆蓋
table_id = :ets.new(:test1, [:set, :public]):ets.insert(table_id, {1, ["2", "xx"]}):ets.insert(table_id, {[3, 4], [13, 98, 97]})
?
:ets.insert(table_name, object) 如果當前鍵已存在,則返回false
?
:ets.match(table_name, pattern)
我們使用原子?:"$1"
、:"$2"
、:"$3"
?等等來表示匹配中所使用的變量。其中的數字只用來表示其在返回值中的位置,而非匹配時的位置。不想要的部分我們可以用?:"_"
?來忽略掉。
:ets.match(table_id, {1, :'$1'}) ["2", "xxx"]
:ets.match_object(table_name, pattern)
?match_object/2
,這個函數忽略那些變量而直接返回整個對象
:ets.match(table_id, {[3, :'$2'], :'$1'}) [{[3, 4}, [13, 98, 97]}]
:ets.tab2list(table_name)
返回一個 ETS 表的所有對象數據的列表
?
:ets.select(table_name, match_spec)? :ets.fun2ms(fun)
這兩個函數通常聯用, :ets.fun2ms 返回一組用于 :ets.select 匹配的模式
?
:ets.lookup(table_name,? key)
返回key對應的對象
?
:ets.first(table_name)
返回第一個元素的鍵
?
:ets.next(table_name, key)
返回當前鍵的下一個鍵
?
:ets.delete_match(table_name, pattern)
刪除匹配成功的數據
?
:ets.delete(table)
刪除整張表
?
:ets.delete(table, key)
刪除key指向的一組數據
?
:ets.safe_fixtable(table, true/false)
鎖定表使其可以安全遍歷,鎖定一個類型是 set,bag 或 duplicate_bag 的表,使其可以安全遍歷表里的數據。在一個進程里調用 ets:safe_fixtable(Tab, true) 可以鎖定一個表,直到在進程里調用 ets:safe_fixtable(Tab, false) 才會解鎖,或進程崩潰。如果同時有幾個進程鎖定一個表,那么表會一直保持鎖定狀態,直到所有進程都釋放它(或崩潰)。有一個引用計數器記錄著每個進程的操作,有 N 個持續的鎖定操作必須有 N 個釋放操作,表才會真正被釋放。當一個表被鎖定,一序列的?ets:first/1?和?ets:next/2?的調用都會保證成功執行,并且表里的每一個對象數據只返回一次,即使在遍歷的過程中,對象數據被刪除或插入。在遍歷過程中插入到表里的新數據可能由?ets:next/2?返回(這取決有鍵的內部順序)。
一個被鎖定的表是不會有被刪除的對象數據從表里被實際刪除,直到它被釋放。如果一個進程鎖定一個表,并不釋放它,那些已刪除的對象數據所占用的內存將永遠不會得到釋放。對表操作的性能也會顯著降低。