自己的看法:
1)如果一个表中数据太大,不要用ordered_set表。(这个表的好处在于可以按key来排序,但只能用这个唯一的key,实际工作中要按复杂的排序规则,所以不好用。
2)ets doc里面有大量的函数如next last, first基本是不用的。这些都是用c写的bif
不用于上层。只要用好ets.erl里面的上层导出就行了。---看看实现也适合。
3)......
%%ets的使用 %%ets:new/2 %% name_table--------标记这个ets表,可以用ets_for_test来操作这个表 %% set ordered_set, bag , duplicate_bag 表结构 前二个key 唯一的 ordered_set有序的(注意这种表的查询是很严格的1与1.0是不同的) %%{keypos,Num} 以什么为key %%操作权限public protected private -record(role_data,{role_id,role_name,tel=13800000}). new(Tab,Type) -> ets:new(Tab, [named_table, Type, public, {keypos, #role_data.role_id}, {write_concurrency, true}, {read_concurrency, true}]). %%插入 %%这个函数不会按照值的前后顺序排序的(ordered_set表除外)。 insert(Tab) -> [begin ets:insert(Tab,#role_data{role_id=RoleID,role_name=RoleName,tel=Tel}) end||RoleID<-lists:seq(1,20),RoleName<-lists:duplicate(20,"test_zhong"),Tel<-lists:seq(13800001,13800020)], io:format("insert into table::Tab~w Data~w",[Tab,ets:tab2list(Tab)]). %%查找bif look_up(Tab,Key) -> T = ets:lookup(Tab,Key), io:format("look_up tab:~w:key:~w:result:~w",[Tab,Key,T]). %%数据太大了。一次性处理不过来就用分页 %%如果想返回表前50个元素: %%{M,C}= ets:match(Tab,'$1',50).就可以做到,便是这只是对数据太大了分布处理所有数据,不要想取出排名前50名的元素,因为只有ordered_set可以做到。 %%{M2,C2} = ets:match(Tab,C). %%... match(Tab,Spec,Limit) ->%%试下:tab = 你建的,spec='$1',limit=4 T = ets:match(Tab,Spec,Limit), io:format("match tab:~w:Spec:~w:Limit:~w:result:~w",[Tab,Spec,Limit]). %%其实最常用的的下面的查找条件函数 %%如果想返回表中满足条件的元素,最好的函数是 %%match_object(Tab, Pattern, Limit) -> {[Match],Continuation} | '$end_of_table' %%match_object(Continuation) -> {[Match],Continuation} | '$end_of_table' %%select(Tab, MatchSpec, Limit) -> {[Match],Continuation} | '$end_of_table' %%select(Continuation) -> {[Match],Continuation} | '$end_of_table' %%只获取数据数量的:select_count(Tab,MatchSpec) -> NumMatched %%其中重点在于MatchSpec的写法:最简单的用法: %%1)match_object(Tab,#r_record{id=45,_='_'}).%%_表示占位符可以任意字段,不可省略 %%2)macth_object(Tabl,{23,_}).%%可以是任务类型 %%3)复杂的只能用ets:fun2ms/2来 %%MS = ets:fun2ms(fun(Data=#r_record{id=ID})when ID>34 -> Data end), %%得到一个一MatchSpec %%match_object(Tab,MS,Limit).%或 %%select(Tab,MS,Limit). %%同理:match_delete/2,match_delete/3也是如此用法 %%遍历一个表做事 %%其实有ets:first/1返回第一个key ets:next/1,这些bif来实现 %%但是可以用ets:foldl/3来做!他的实现如下 %% foldl(F, Accu, T) -> %% ets:safe_fixtable(T, true), %% First = ets:first(T), %% try %% do_foldl(F, Accu, First, T) %% after %% ets:safe_fixtable(T, false) %% end. %% do_foldl(F, Accu0, Key, T) -> %% case Key of %% '$end_of_table' -> %% Accu0; %% _ -> %% do_foldl(F, %% lists:foldl(F, Accu0, ets:lookup(T, Key)), %% ets:next(T, Key), T) %% end. %%所以要是用遍历时就用ets:fold/3就可以了。那些last next这些太底层了。有封装好的。 %%查看表的详细情况可以用 %%返回所有的ets表(只在终端上显示) %%ets:all(). %%列出一个ets的表类型,使用内存,所有者信息|(只在终端上显示) %%ets:i(). %%最详细信息了 %%ets:info(Table).