第19章 用ETS和DETS存储数据

可以用来搞笑存储海量的Erlang数据,提供大型的键值查询表,ETS常驻内存,DETS则常驻磁盘,ETS表查询速度更快,而DETS运行时占用的内存更小

1.表的类型

  • 保存的是元组,元组里的某一个元素(默认是第一个)被称为该表的键.通过键可以向表里插入和提取元组.分为连个基本的表类型:异键表(set)和同键表(bag);基本表类型有有四种表类型:异键,有序异键,同键,副本同键

2.四种基本操作

  • 1)创建一个新表或打开现有的表: 用ets:new或dets:open_file实现
  • 2)向表里插入一个或多个元组: insert(TableId,X),其中X是一个元组或元组列表
  • 3)在表里查找某个元组: lookup(TableId,Key) ,得到的结果是一个匹配key的元组列表
  • 4)丢弃某个表: dets:close(TableId) 或 ets:delete(TableId).

3.创建一个ETS表

  • 1)ets:new(Name,[Opt]) -> TableId : Name是一个原子,[Opt]是一列选项分为:
    • set|ordered_set|bag|duplicate_bag : 创建一个指定类型的ETS表
    • private 创建一个私有表,只有主管进程才能读取和写入它
    • public 创建一个公共表,任何知道此表标识符的进程都能读取和写入它
    • protected 创建一个受保护表,任何知道此表标识符的进程都能读取它,但只有主管进程才能写入它
    • named_table 如果设置了此选项,Name就可以被用于后续的表操作
    • {keypos,K} 用K作为键的位置,通常键的位置是1。基本上唯一需要使用这个选项的场合是保存Erlang记录(它其实是元组的另一种形式),并且记录的第一个元素包含记录名的时候。
  • 2)建表示例:ets_test.erl
    -module(ets_test).
    -export([start/0]).
    
    start()->
        lists:foreach(fun test_ets/1,[set,ordered_set,bag,duplicate_bag]).
    test_ets(Mode)->
        TableId=ets:new(test,[Mode]),
        ets:insert(TableId,{a,1}),
        ets:insert(TableId,{b,2}),
        ets:insert(TableId,{a,1}),
        ets:insert(TableId,{a,3}),
        List=ets:tab2list(TableId),
        io:format("~-13w => ~p~n",[Mode,List]),
        ets:delete(TableId).
    
    
    1>ets_test: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}]

猜你喜欢

转载自blog.csdn.net/qq_34755443/article/details/84317626
今日推荐