首页 > 代码库 > [Erlang之旅 0005] ETS 和Record
[Erlang之旅 0005] ETS 和Record
ETS 提供“键-值” 搜索表, 驻留在内存中,速度较快。是缓存的大利器。
record 作为erlang的一种数据结构,通常用于函数量传递。
ETS中创建表, 对数据进行增、删、改、查 , 及关闭表常用的函数
ets:new(Name, Options) -> tid() %% 创建表
Options:
Type: set | ordered_set | bag | duplicate_bag
set: 每一个元组的键值都不能相同;ordered_set:元组键不能相同,并且会进行排序
bag:多个元组有相同的键,但是不能完全相同;duplicate_bag:允许多个元组有相同的键,而且可以完全相同。
Access:public | protected | private
public:公开表, 所有知道这个表标识的进程都可以对这个表进行读写操作
protected:受保护的表, 知道表标识的进程只可以读操作,但是这个表的所有者进程可以进行读写操作。
private:私有表,只有所有者进程可以读写这个表。
named_table:命名表,如果存在这个选项,则后续操作中使用Name来操作表。
{keypos, Pos}:用Pos作为主键,默认情况下是第一位置。在使用record的时候,需要用到这个选项
ets:insert(Tab, ObjectOrObjects) -> true %%表内插入一条数据
ets:delete(Tab, Key) -> true %%删除表内指定key的数据
ets:delete_all_objectes(Tab) -> true %%删除表内所有数据
ets:update_element(Tab, Key, ElementSpec :: {Pos, Value}) -> boolean() %%Pos=integer() >=1 更新数据
ets:lookup(Tab, Key) -> [Object] %%按照key查找表内的数据
ets:delete(Tab) -> true %%删除表
下面的一个例子来实现这些功能
1> rd(student, {id, name, pwd, age, sex=man}). %%定义一个recordstudent2> ets:new(stu, [set, public, named_table, {keypos, #student.id}]). %%创建一个tablestu3> Stu1=#student{id=‘0001‘, name=nike, pwd=‘0001‘, age=18}. %% 创建一个record#student{id = ‘0001‘,name = nike,pwd = ‘0001‘,age = 18, sex = man}4> ets:insert(stu, Stu1). %% 向Table中添加一条数据true5> ets:lookup(stu, ‘0001‘). %% 查找数据[#student{id = ‘0001‘,name = nike,pwd = ‘0001‘,age = 18, sex = man}]6> io:format("~p~n",[ets:tab2list(stu)]). %% 打印table 中的数据[{student,‘0001‘,nike,‘0001‘,18,man}]ok7> ets:lookup(stu, ‘0001‘).[#student{id = ‘0001‘,name = nike,pwd = ‘0001‘,age = 18, sex = man}]8> ets:update_element(stu,‘0001‘,{#student.pwd, ‘nike‘}). %% 更新数据true9> ets:lookup(stu, ‘0001‘).[#student{id = ‘0001‘,name = nike,pwd = nike,age = 18, sex = man}]10> ets:delete(stu, ‘0001‘).true11> ets:lookup(stu, ‘0001‘). %% 删除数据[]12> ets:delete(stu). %% 删除表true13>