[erlnag] ETS & DETS

erlang提供的k-v存储 ets保存在内存里 dets保存在磁盘上

ETS表与正常的进程存储空间是分离的,其存储区域与普通进程无关,ETS表隶属于创建它的进程,当这个进程死掉或者调用了ets:delete,ETS表就被删掉了

测试&示例代码

 1 -module(test_ets).
 2 -compile(export_all).
 3 
 4 start() ->
 5     %% 4种不同表的类型
 6     lists:foreach(fun test/1,[set,ordered_set,bag,duplicate_bag]).
 7 
 8 test(Mode) ->
 9     %% 表类型 set,ordered_set,bag,duplicate_bag 
10     %% 访问控制 private,protected,public
11     %% named_table 后续操作使用tablename来操作 如 ets:inert(tablename,{a,1234}).
12     TableId = ets:new(tablename,[Mode,named_table]),
13     ets:insert(TableId,{a,1}),
14     ets:insert(TableId,{b,2}),
15     ets:insert(tablename,{a,1}), %% 使用tablename
16     ets:insert(TableId,{a,3}),
17     List = ets:tab2list(tablename),
18     io:format("~-13w => ~p~n",[Mode,List]),
19     ets:delete(tablename).
20 
21 test_new() ->
22     ets:new(tablename,[set,public,named_table]).
23 
24 test_insert(Key,Value) ->
25     ets:insert(tablename,{Key,Value}).
26 
27 test_lookup(Key) ->
28     ets:lookup(tablename,Key).
29 
30 test_delete() ->
31     ets:delete(tablename).
32 
33 %% dets
34 %% 文件大小不能超过2G
35 open(File) ->
36     io:format("dets opened:~p~n",[File]),
37     Bool = filelib:is_file(File),
38     case dets:open_file(?MODULE,[{file,File}]) of
39         {ok,?MODULE} ->
40             case Bool of
41                 true -> void;
42                 false -> ok = dets:insert(?MODULE,{free,1})
43             end,
44             true;
45         {error,Reason} ->
46             io:format("cannot open dets table:~p~n",[Reason]),
47             exit(eDetsOpen)
48     end.
49 
50 close() -> dets:close(?MODULE).
51 
52 test_dets_insert(Key,Value) ->
53     dets:insert(?MODULE,{Key,Value}).
54 
55 test_dets_lookup(Key) ->
56     dets:lookup(?MODULE,Key).

运行结果

Eshell V5.8.4  (abort with ^G)
1> c(test_ets).
{ok,test_ets}
2> test_ets:start().
set           => [{b,2},{a,3}]
ordered_set   => [{a,3},{b,2}]
bag           => [{b,2},{a,1},{a,3}]
duplicate_bag => [{b,2},{a,1},{a,1},{a,3}]
ok
3> T = ets:new(test,[public,set]).
32784
4> ets:insert(T,{key,23456}).
true
5> ets:lookup(T,key).        
[{key,23456}]
6> c(test_ets).                   
{ok,test_ets}
7> test_ets:open("test.bin").     
dets opened:"test.bin"
true
8> test_ets:test_dets_insert(a,b).
ok
9> test_ets:test_dets_lookup(a).  
[{a,b}]
原文地址:https://www.cnblogs.com/bluefrog/p/2501965.html