5-Erlang KEY VALUE数据存储 ETS

ets和dets是两个系统模块,可以用来高效存储海量的Erlang数据。ETS是Erlang Term Storage (Erlang数据存储)的缩写,DETS则是Disk ETS(磁盘ETS)的缩写。

ETS和DETS执行的任务基本相同:它们提供大型的键值查询表。ETS常驻内存,DETS则 常驻磁盘。ETS是相当高效的:可以用它存储海量的数据(只要有足够的内存),执行查找的时 间也是恒定的(在某些情况下是对数时间)。DETS提供了几乎和ETS一样的接口,但它会把表保 存在磁盘上。因为DETS使用磁盘存储,所以它远远慢于ETS,但是运行时的内存占用也会小很 多。另外,ETS和DETS表可以被多个进程共享,这就让跨进程的公共数据访问变得非常高效。

ETS表里的数据保存在内存里,它们是易失的。当ETS表被丢弃或者控制它的Erlang进程终 止时,这些数据就会被删除。保存在DETS表里的数据是非易失的,即使整个系统崩溃也能留存 下来。DETS表在打开时会进行一致性检查,如果发现有损坏,系统就会尝试修复它(这可能会 花费很长时间,因为表里的所有数据都要检查)。

ETS表看上去像是用Erlang实现的,但事实上它们是在底层的运行时系统里实现的,有着不 同于普通Erlang对象的性能特点。特别需要指出的是,ETS表没有垃圾收集机制,这就意味着即 使ETS表极其巨大也不会有垃圾收集的负担。不过,创建或访问ETS对象仍然会带来少许开销

表的类型

ETS和DETS表保存的是元组

一些表被称为异键表(set),它们要求表里所有的键都是唯一的。另一些被称为同键表(bag), 它们允许多个元素拥有相同的键。

基本的表类型(异键表和同键表)各有两个变种,它们共同构成四种表类型:异键、有序异 键(ordered set)、同键和副本同键(duplicate bag)。

  • 在异键表里,各个元组里的键都必须是独一 无二的。
  • 在有序异键表里,元组会被排序。
  • 在同键表里可以有不止一个元组拥有相同的键,但是 2 不能有两个完全相同的元组。
  • 在副本同键表里可以有多个元组拥有相同的键,而且在同一张表里 可以存在多个相同的元组。

ETS表在内部是用散列表表示的(除了有序异键表,它是用平衡二叉树表示的)。

  • 使用异键表会带来少许空间开销,,插入异键表所需的时间是恒定的,
  • 而使用有序异键表会带来时间开销。 而插入有序异键表所需的时间与表内条目数量的对数成比例

创建一个 ETS 表

创建ETS表的方法是调用ets:new。创建表的进程被称为该表的主管。创建表时所设置的一 组选项在以后是无法更改的。如果主管进程挂了,表的空间就会被自动释放。你可以调用 ets:delete来删除表。
ets:new的参数如下。

-spec ets:new(Name, [Opt]) -> TableId 其中,Name是一个原子。[Opt]是一列选项,源于下面这些参数。 
  • set | ordered_set | bag | duplicate_bag
    创建一个指定类型的ETS表(我们之前讨论过)。
  • private
    创建一个私有表,只有主管进程才能读取和写入它
  • public
    创建一个公共表,任何知道此表标识符的进程都能读取和写入它。
  • protected
    创建一个受保护表,任何知道此表标识符的进程都能读取它,但只有主管进程才能写 入它。
  • named_table
    如果设置了此选项,Name就可以被用于后续的表操作。
  • {keypos, K}
    用K作为键的位置。通常键的位置是1。基本上唯一需要使用这个选项的场合是保存Erlang
    记录(它其实是元组的另一种形式),并且记录的第一个元素包含记录名的时候。

注意 不使用任何选项打开一个ETS表就相当于用[set,protected,{keypos,1}]选项打开它


, , ,