ets基础:
1、ets和dets基本是做统一件事情:提供大型的“键-值”搜索表。ets驻留在内存,dets驻留在磁盘。
2、ets和dets可以被多个进程共享。
3、ets和dets表的结构数据是“键-值”对。我们在表的最常用的操作是插入和查找。一个ets和dets表其实就是一系列erlang元祖。
4、ets中的数据是临时存储的,这意味着当数据被释放的时候,响应的数据也被丢弃。而dets的数据存储是持久的。
5、ets表可以在需要高效操纵海量数据的场合都可以大显身手。
6、ets和dets表存储元祖。元组中的一个元素(默认为第一个元素)称作表的键。
7、表的类型: set,要求所有的元组键值各不相同;ordered set,元组进行排序; bags,允许多个元组有相同的键值,但是不能有两个完全相同的元组;duplicate bag,不仅多个元组可以有相同的键值,同一个元组也可以出现多次。
8、调用ets:new创建ets表。创建表的进程就是表的所有者。表创建后属性不能修改。如果所有者进程死掉,或者调用ets:delete时,就会自动释放表的内存空间。ETS表不在GC的管理范围内,除非拥有它的进程死掉它才会终止;可以通过delete删除数据
9、创建参数private、public、protected、named_table、{keypos, k}。
10、ETS查询时间是常量,例外是如果使用ordered_set查询时间与logN成正比(N为存储的数据量)
11、一个Erlang节点的ETS表的数量是有限制的,默认是1400个表,在启动erlang节点之前修改 ERL_MAX_ETS_TABLES参数可以修改这个限制
12、并发控制:所有针对一个对象的更新都被保证是原子的、隔离的:修改要么全部成功要么失败。也没有其它的中间结果被其它的进程使用。有些方法可以在处理多个对象的时候保证这种原子性和隔离性。
查看ets:
ets:all() 列出所有的ETS Table
ets:i() 给出一个ETS Table的清单 包含表的类型,数据量,使用内存,所有者信息
ets:i(s2s) 输出s2s表的数据,个人感觉这个非常方便比tv还要简单快捷,如果表数据量很大,它还提供了一个分页显示的功能
ets:info(s2s) 单独查看一个ETS Table的详细信息也可以使用这个方法,如果怀疑这个表被锁了可以使用ets:info(s2s,fixed)查看,ets:info(s2s,safe_fixed) 可以获得更多的信息,这样比较容易定位是哪个模块出了问题.
ets:member(Tab, Key) -> true | false 看表里面是否存在键值为Key的数据项.
ets:match/1 ets:match/2 ets:match/3
一个匹配模式也许包含的项值有:绑定部分(Erlang 项),‘_‘ 可以匹配任何 Erlang 项,和匹配变量:‘$N‘(N>=0)
函数将返回一个匹配每个对象数据的元素的列表,每个元素是一个绑定变量模式的有序列表。