• [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}]
  • 相关阅读:
    Linux如何编译安装源码包软件
    安装python发行版本,并用conda来管理Environments,Python,packages
    命令远程传输文件
    CentOS7更换yum源为阿里云镜像源
    CentOS安装pip并修改源为豆瓣源
    查看SELinux状态及关闭SELinux
    解决CentOS查询不到ip
    chmod变更文件或目录的权限
    开启HTML5之旅。。。
    JDK 动态代理的实现
  • 原文地址:https://www.cnblogs.com/bluefrog/p/2501965.html
Copyright © 2020-2023  润新知