erlang est表

ETS是Erlang Term Storage 的缩写,它是一个基于内存的KV( Key Value) Table,支持大数据量存储以及高效查询。

ETS表的基本:
1、ETS 表可以用来高效存储海量的erlang数据,ETS提供大型的键-值查询表.
2、ETS是相当高效的:可以用它存储海量的数据(只要有足够的内存),最常用的表操作是插入和查找.
3、ETS表的数据保存在内存里,他们是易失的。当ETS表被丢弃或控制它的进程终止时,数据就会被删除.
4、ETS表是底层运行时系统里实现的,ETS表没有垃圾回收机制,即使ETS表及其巨大也不会有垃圾回收的负担,不过,创建和访问ETS对象任然会带来少许开销.

1、新建ETS表
ets:new(name,option).
name:ETS表名
option:一列选项
1) set | ordered_set | bag | duplicate_bag 创建一个指定类型的表
2) private 创建一个私有表,只有主管进程才能读取和写入它
3)public 创建一个公共表 , 任何进程在知道此表的标示符时都可以读取和写入
4) protected 创建一个受保护的表, 任何进程在知道此表的标示符时都可以读取,但只有主管进程和已有写入权限
5) named_table 如果设置了此选项,Name就可以被用于后续的表操作
6){keypos,K} 用K作为键的位置,唯一需要使用这个选项是保存erlang记录,并且记录的第一个元素包含记录名的时候


2、添加元素
ets:insert(Tab,ObjectOrObjects) -> true
向ETS表Tab插入一个对象数据或者一个对象列表数据 ObjectOrObjects。
如果表是一个 set 类型的表,并且插入的对象数据的键在表里可以匹配得到数据,那么旧的对象数据将会被替换。
如果表是一个 ordered_set 类型的表,并且在表里有跟插入的对象数据有相同的键,那么旧的对象数据将会被替换。
如果插入的对象列表数据里存在多个相同键的情况,并且表是一个 set 类型的表,那么只有一个对象数据可以被插入,不过不确定是哪一个。
对于 ordered_set 类型的表,如果键一样时,操作的情况像上面一样。 整个操作都保持着原子性和独立性,即使有多个对象数据插入的情况。

3、返回est list
ets:tab2list(Tab) -> [Object]:返回一个ETS表的所有对象数据的列表。

4、通过key获取value
ets:lookup(Tab,Key) -> [Object]:
返回表 Tab 里键为 Key 的所有对象数据的列表,注意,这里一定要用key进行匹配,不能用其他的字段。
在类型是 set、bag、duplicate_bag 表里,只有跟键 Key 相匹配的对象数据才会返回。
如果是 ordered_set 类型的表的话,就只有跟键相等的情况下才会返回。这两者的区别就像 =:= 跟 == 一样。
如果是 set 或 ordered_set 类型的表,那么该函数会返回一个空列表或者一个元素的列表,因为这些类型的表里不可能存在多个相同键的对象数据。
如果是 bag 或 duplicate_bag 类型的表,那么该函数则返回任意长度的列表。
数据插入的顺序是有保存的,第一笔插入的数据,返回的时候也是排在第一位。
在类型是 set、bag、duplicate_bag 表里,插入和查找的时间是恒定的,跟表的大小无关。对于 ordered_set 类型的表,插入和查找的时间跟表的大小成正比。

5、ets:i(Tab) -> 'ok' :在输出端上打印显示指定ETS表的Tab信息
ets:i() -> 'ok' :在输出端上打印显示所有ETS表的信息

6、ets: delete_all_objects(Tab) -> true
删除表 Tab 里的所有对象数据。该操作会保持数据的原子性(atomic)和独立性(isolated)。

7、Erlang中ETS可以和Record无缝结合

 

-record(account, {account_id, name, sex, email}).%%定义一个记录
shell命令窗口载入记录:rd(account, {account_id, name, sex, email}).
%% 创建账户表  |  以account的id作为记录对象的键.
account = ets:new(account, [named_table, set, {keypos, #account.account_id}]).
%% 模式匹配查询
ets:match_object(account, {'_', '_', '_',1, '_'}). %% 非record方式
ets:match_object(account, #account{sex = 1, _='_'}).   %% 使用RECORD,通用匹配部分为: _='_' %%
更新
ets:update_element(account, 1, {#account.name, "jason"}).  %% 更新一个值
ets:update_element(account, 1, [{#account.name, "jason"}, {#account.email, "jason@gmail.com"}]).   %% 更新多个值
%% 插入 创建一个记录,然后把记录的项式插入到ets表中
AccountRecordA = #account{account_id = 1, name = "jason", sex = 1, email = "jason1@gmail.com"}.
AccountRecordB = #account{account_id = 2, name = "tlc", sex = 2, email = "jason2@gmail.com"}.
ets:insert(account, AccountRecordA).
ets:insert(account, AccountRecordB).

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值