您的位置:首页 > 其它

Erlang中ETS的一些用法总结

2013-07-13 02:32 761 查看

前言:

Erlang里的ETS也用了一段时日了,在这里把自己的一些新的记录下来与大家分享一下,有任何不当之处欢迎噶为前辈高人指教

怎么与RECORD相结合:

这个网络上有好多前辈已经写了过了,这里我再赘述一下.在Erlang中ETS可以和Record无缝结合,具体方法如下:

%% 示例代码
-record(account, {account_id, name, sex, email}).

%% 创建账户表  |  以account的id作为记录对象的键.
account = ets:new(account, [named_table, set, {keypos, #account.account_id}]).

%% 查询性别为1的用户
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"}]).   %% 更新多个值

%% 插入
AccountRecord = #acount{account_id = 1, name = "jason", sex = 1, email = "jason@gmail.com"}.
ets:insert_new(account, AccountRecord).


大家应该看明白了吧,我一开始懒得费事键这些record,但到了后来,代码越来越多,功能越来越多,策划时不时的增加个东西,你修改这些个语句的匹配就成为了非常麻烦的事情.最后我也是在不厌其烦下改成了这种方式,发现自己真是活该找罪受啊.

关于MATCH的一些用法和小技巧:

match和match_object大多数人的意见都是能不用尽量不用,我也赞同这种说法,但你不可能逃脱的掉match的魔掌,所以,既然无法反抗那就享受吧.(你们猜得到我现在的表情吗?).

Continuation:不陌生是吧, 你用match的一些高级技巧一般都会出现这位大哥. 同样它也被作为参数用于ets:match/1,match_object/1等函数中.查看源码我们可以知道,

这个Continuation有3个值:

-type continuation() :: '$end_of_table'
| {tab(),integer(),integer(),binary(),list(),integer()}
| {tab(),_,_,integer(),binary(),list(),integer(),integer()}.

 

在使用match的时候我们可以,我们可以通过Continuation来设定一定的条件来进行匹查询.

例如:我们要查看消费积分排行在1238位的一个用户的前10个用户或后10个用户,我们就可以根据Continuation来设计一个这样的起始表达式.

但实际应用这个表达式的时候ets:match/match_object会提示你参数错误,这是为什么呢?根据源码观察,在系统调用match/match_object的时候,最后的返回如果带有Continuation,那这个结果一定是被重新编译过的.而我们自己手动编写的这个结构也只是一个简单的term.所以如果要使用我们自定义的这个Continuation,我们就必须调用repair_continuation/2这个函数.

repair_continuaton(Continuation, MatchSpec).

这里的Continuation就是我们自定义的那个,而MatchSpec,则需要调用ets:fun2ms来产生.

例如:

-record(pay_order, {order, uid}).
-include_lib("stdlib/include/ms_transform.hrl").
%% 要使用ets:fun2ms/1必须引入此文件
MS = ets:fun2ms(fun(OrderRecord = #pay_order) -> [OrderRecord] end).

 

获取MS后就可以用这个MS来修复我们自定义的Continuation了,完成后,我们就可以使用我们自定义的Continuation了.

总结:

以上就是我在使用ETS的时候遇到的一些小问题的总结,总的来说就是2个方面,一个是ETS与Record的结合,一个就是在使用match/match_object等函数时会遇到的一些问题.这里着重讲了ets的一个返回类型Continuation.

至于ETS的一些基本问题,大家可以看各位大神的博客,都有很详细的介绍. 上文内容如有不当之处希望各位高人指正,小弟感激不尽.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: