[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}).                         %%定义一个record
student
2> ets:new(stu, [set, public, named_table, {keypos, #student.id}]).     %%创建一个table
stu
3> 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中添加一条数据
true
5> 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}]
ok
7> ets:lookup(stu, ‘0001‘).
[#student{id = ‘0001‘,name = nike,pwd = ‘0001‘,age = 18,
          sex = man}]
8> ets:update_element(stu,‘0001‘,{#student.pwd, ‘nike‘}).                %% 更新数据
true
9> ets:lookup(stu, ‘0001‘).
[#student{id = ‘0001‘,name = nike,pwd = nike,age = 18,
          sex = man}]
10> ets:delete(stu, ‘0001‘).
true
11> ets:lookup(stu, ‘0001‘).                                             %% 删除数据
[]
12> ets:delete(stu).                                                     %% 删除表
true
13> 

[Erlang之旅 0005] ETS 和Record,布布扣,bubuko.com

时间: 2024-08-10 17:20:13

[Erlang之旅 0005] ETS 和Record的相关文章

[Erlang之旅 0009] socket 通讯

前面学习完了gen_server .gen_tcp 现在做一个简易的socket通讯,服务端将接收到的信息返回给客户端,具体代码如下: 服务端: 1 -module(tcp_socket3). 2 -behaviour(gen_server). 3 4 -export([start/0, login/2, stop/0]). 5 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_chan

[Erlang之旅 0004] gen_server

gen_server:start_link(ServerName, Module, Args, Options) -> Result ServerName={local, Name}|{global, GlobalName}|{via, Module, ViaName} Option = {debug, Dbgs}|{timeout, Time}|{spawn ——opt, Sopts} Module: 回调模块的名称 Args: 传给回调模块中init函数的参数 call(ServerRef,

[Erlang之旅 0008] string 常用函数

参考文档:http://www.erlang.org/erldoc?q=string%3Bright&x=-967&y=-384 string类型,经常用到,所有练习一下: 3> string:len("fan"). %% 字符串长度 3 4> string:len("你的"). 2 5> string:len("fan你的中国"). 7 6> string:equal("an",&qu

[Erlang之旅 0006] 二进制位串

位串可以写作<< E1,E2....En>>,其中双小于号和双大于号之间可以包含零个或多个区段指示符,位串以比特位为单位的整体长度.区段指示符可以为以下形式之一: Data | Data:Size | Data/TypeSpecifiers | Data:Size/TypeSpecifiers TypeSpecifiers :  主要控制区段编解码的细节,它由一个或多个由(-)分隔的原子组成,例如 integer-unsigned-big 原子出现的顺序不重要,可以用的指示符如下,

[Erlang之旅 0001] 基本数据类型

数据的基本类型:数值.原子.元组.列表 1 .在Erlang的世界内,一但变量赋值之后,变量不会改变,如果再赋予其它值,就会报错,这和其它大多数语言不同.变量命名通常以大写字母开头,如果有多个单词,则每个单词的首字母大写,如:LastName='YY' 2 . 数值:包含整数和浮点 大部分的算术运算都会自动进行类型转换. 3. 原子 原子是一种仅由字符序列来标识的特殊字符串常量.两个原子只要具有相同的字符表示,就完全相同. 原子的命名: 原子通常以小写字母开头,首字母后可以用大写字母.数字.下划

erlang中list和ets的查找

最近发现一个ets和list的查找小问题,以前一直没有注意,问题是这样的,一样的数据在list中能够查到,但是在ets中查不到: 从上图可以看出,对于list中可以使用2.0找到2,但是在ets中却不行,说明lists中查找使用的是==而ets中使用的是=:=,虽然不是什么特别严重问题,但是可能会在代码中留下难以发现的bug

Erlang提高ETS并发读写性能

ETS是Erlang内置的内存数据库,可用于多进程共享数据,具有并发读写的性能,文章就这点展开探讨,重点说说ets并发读写两个参数的优缺点及适用场合. 比如新建一个person的ets表: ets:new(person, [set, public, named_table, {write_concurrency, true}, {read_concurrency, true} ]). 说说ets并发读写的两个参数:write_concurrency / read_concurrency writ

Erlang中的record与宏

http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html 在Erlang中使用Tuple ,数据项的顺序\数量都是确定的,一旦数据项顺序调整或者增减字段,都容易出现badmatch. 同时一些常量如果硬编码到代码中,一旦数值变化,要想全部可靠的替换成新的数值是一个困难的事情. 这两种数据层面的变化,在Erlang中对应的解决方案是: record  Macro record   在代码中我们创建一个record:   -rec

Erlang 杂记

学习Erlang的时候在书的留白处随手记录了一些东西,还有一些记录在了demo的注释里面,今天抽时间整理出来了一部分,分享一下. Erlang的设计哲学是为每一个独立的事件创建一个新进程. Erlang的容错处理:如果不能完成一个任务就死掉 让其它正常的进程来善后.link函数就是用来建立这种进程间的双向连接来监测非正常退出,并做出处理. BIFs是built-in functions的缩写代表这些方法是Erlang运行时系统的一部分 side-effect-free无副作用,其中一种定义是说: