额 电子书是买了 然后再买了本erlang程序设计
再看ets和dets那部分 就权当做个笔记啦....
erlang程序设计 写道
ETS和DETS基本上是在做同一件事:它们提供大型的“键—值”搜索表。所不同的是,ETS驻留在内存,而DETS驻留在磁盘。
表的类型有四个 分别是:set、ordered set、bag和duplicate bag
set系列两个 set是保证主键唯一 ordered set会根据主键排序(set就是插入顺序啦) 这里需要注意的是 insert操作如果遇到主键重复了 并不会报错 而是覆盖
bag系列 bag是主键可以重复但是元组要不同 duplicate bag就是可以多个重复的元组了。
基本操作1:
-module(ets_test). -export([start/0]). start() -> lists:foreach(fun create/1,[set,ordered_set,bag,duplicate_bag]) . create(Mode) -> TableId=ets:new(test,[Mode]), ets:insert(TableId, {a,1}), ets:insert(TableId, {b,2}), ets:insert(TableId, {a,1}), ets:insert(TableId, {a,3}), List = ets:tab2list(TableId), io:format("~-13w => ~p~n" , [Mode, List]), ets:delete(TableId).
结果如下: 70> c(ets_test). {ok,ets_test} 71> ets_test:start(). set => [{b,2},{a,3}] ordered_set => [{a,3},{b,2}] bag => [{b,2},{a,1},{a,3}] duplicate_bag => [{b,2},{a,1},{a,1},{a,3}] ok
set如果主键重复是覆盖很容易就可以看出来。(以上set中{a,1}已经被{a,3}覆盖了)
创建参数:
erlang程序设计 写道
调用ets:new可以创建ETS表。创建表的这个进程就是表的所有者。表创建之后,它的一系列属性设置不能再更改。如果所有者进程死掉,或者调用ets:delete时,就会自动释放表的内存空间。
ets:new的参数是下面这样的。
@spec ets:new(Name, [Opt]) -> TableId
Name是一个原子,[Opt]是一个选项列表,取值范围如下。
set | ordered_set | bag | duplicate_bag。
private。创建私有表,只有所有者进程可以读写这个表。
public。创建公开表,所有知道这个表标识的进程都可以对这个表进行读写操作。
protected。创建受保护的表,所有知道这个表标识的进程都可以对这个表进行读操作,但只有这个表的所有者进程可以对这个表进行写操作。
named_table。命名表,如果存在这个选项,则可以在后续操作中使用Name来操作表。
{keypos, K}。使用K作为键的位置,通常情况下使用的是第一个位置。可能只有一种情况才需要用到这个选项,那就是当我们需要存储Erlang的记录时(记录实际上是变相的元组),它的第一元素包含的是这个记录的名字(对每个记录来说,它的值都是一样的)。
说明 打开一个ETS表时不带任何选项,等同于使用了这样的默认选项[set,protected, {keypos,1}]。
ets:new的参数是下面这样的。
@spec ets:new(Name, [Opt]) -> TableId
Name是一个原子,[Opt]是一个选项列表,取值范围如下。
set | ordered_set | bag | duplicate_bag。
private。创建私有表,只有所有者进程可以读写这个表。
public。创建公开表,所有知道这个表标识的进程都可以对这个表进行读写操作。
protected。创建受保护的表,所有知道这个表标识的进程都可以对这个表进行读操作,但只有这个表的所有者进程可以对这个表进行写操作。
named_table。命名表,如果存在这个选项,则可以在后续操作中使用Name来操作表。
{keypos, K}。使用K作为键的位置,通常情况下使用的是第一个位置。可能只有一种情况才需要用到这个选项,那就是当我们需要存储Erlang的记录时(记录实际上是变相的元组),它的第一元素包含的是这个记录的名字(对每个记录来说,它的值都是一样的)。
说明 打开一个ETS表时不带任何选项,等同于使用了这样的默认选项[set,protected, {keypos,1}]。
书上的内容也就这么多了 关于如何查找 利用匹配删除什么的都没讲 有空做个示例吧 先写到这了。