ets
: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 返回(这取决有键的内部顺序)。
一个被锁定的表是不会有被删除的对象数据从表里被实际删除,直到它被释放。如果一个进程锁定一个表,并不释放它,那些已删除的对象数据所占用的内存将永远不会得到释放。对表操作的性能也会显著降低。