erlang学习笔记之ets

ETS和DETS都是两个系统模块,可以用来储存海量的数据,

ETS的全称是Erlang Term Storage(erlang 数据储存),

Dets就是加了个Disk,磁盘ETS,他们的任务相同,提供大型的KV(Key-Value)查询表,ETS比DETS高效,它储存在内存中。

一、ETS

ets的类型

首先分为两个大类:

  • 异键表(set):要求键是唯一的
    • 异键表
    • 有序异键表(ordered set):元组会被排序
  • 同键表(bag):允许多个元素使用同一个键,但不能允许有键-值完全相同的元素存在
    • 同键表
    • 副本同键(duplicate bag)

细分为4类

settable中的每一个Value(Tuple)都是唯一,并且一个Key只能对应一个Value
ordered_set同set,唯一不同的是table中的Key是有序的
bagtable中的每一个Value都是唯一,但是一个key可以对应多个Value
duplicate_bagtable中每一个key可以对应多个Value,并且允许Value重复

效率

set, bag, duplicate_bag内部是采用哈希结构实现,因此查找效率很高,O(1); 
ordered_set 内部是采用平衡树结构实现(Key之间是有序的),查找效率相比其他类型略低,是logN级别的; 

二、DETS

ETS把元组保存在内存里,而DETS把元组保存在磁盘上,它的最大文件大小是2GB,DETS文件必须先打开才可以操作,用完以后还要正确关闭。

他们之间表的属性也不一样,DETS在打开文件时必须赋予一个全局名称,如果两个或者更多的进程以同一个名称和选项打开了文件,他们就会共享这个表,直到所有进程都关闭他,否则一直是打开状态

三、ETS表的各种方法:


ets:all/0
获取所有的 ets 表

ets:delete/1
删除整张表

ets:delete/2
删除表里指定键的所有数据

ets:delete_all_objects/1
删除表里的所有数据

ets:delete_object/2
删除表里的指定数据

ets:first/1
获取 ETS 表里的第一个对象数据的键

ets:foldl/3
对 ETS 数据遍历循环操作

ets:fun2ms/1
把语法函数转为匹配规范的伪函数

ets:give_away/3
改变一个表的拥有者

ets:i/0
在输出端上打印显示所有 ETS 表的信息

ets:info/1
返回一个 ETS 表的信息

ets:info/2
返回给出的跟表相关的项的信息

ets:insert/2
向 ETS 表插入数据

ets:insert_new/2
向 ETS 表插入新数据

ets:is_compiled_ms/1
检测一个 Erlang 数据是否是一个有效已编译的匹配规范

ets:last/1
返回表里的最后一个键

ets:lookup/2
在 ETS 表里查出相应键的值

ets:lookup_element/3
返回 ETS 表里指定键的对象数据的第几个元素数据

ets:match/1 | ets:match/2 | ets:match/3
根据匹配模式匹配表里的对象数据

ets:match_delete/2 | ets:match_object/1 | ets:match_object/2 | ets:match_object/3
根据匹配模式删除表里的对象数据

ets:member/2
判断表里面是否存在指定键的数据

ets:new/2
创建一个 ets 表

ets:next/2
返回表的下一个键

ets:prev/2
返回表的上一个键

ets:rename/2
重新给 ETS 表命名一个名字

ets:safe_fixtable/2
锁定一定 ETS 表使其可以安全遍历

ets:select/1
对 ETS 表里的数据进行匹配比对

ets:tab2list/1
返回一个 ETS 表的所有对象数据的列表

ets:update_element/3
更新 ETS 表里指定键的对象数据的第几个元素数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Erlang中,我们可以使用`gen_tcp`模块来实现TCP客户端。下面是一个简单的例子,展示如何使用`gen_tcp`模块来连接到一个服务端: ```erlang -module(tcp_client). -export([start/1]). start(Host) -> {ok, Socket} = gen_tcp:connect(Host, 80, [binary, {packet, 0}]), gen_tcp:send(Socket, "GET / HTTP/1.0\r\n\r\n"), receive_data(Socket), gen_tcp:close(Socket). receive_data(Socket) -> case gen_tcp:recv(Socket, 0) of {ok, Data} -> io:format("~s", [Data]), receive_data(Socket); {error, closed} -> ok end. ``` 在上面的例子中,`gen_tcp:connect`函数用于连接到指定的服务端。`Host`参数是服务端的IP地址或域名,`80`是服务端的端口号。`[binary, {packet, 0}]`选项说明我们要传输二进制数据,且数据包不需要打包。 一旦连接建立成功,我们就可以使用`gen_tcp:send`函数向服务端发送数据了。在这个例子中,我们发送了一个HTTP GET请求。接着,我们调用了`receive_data`函数来接收服务端返回的数据。`gen_tcp:recv`函数用于接收服务端发送的数据。`0`参数表示接收的数据包没有大小限制。如果接收到数据,我们就打印出来,并继续调用`receive_data`函数来接收更多的数据。如果服务端关闭了连接,`gen_tcp:recv`函数会返回错误信息`{error, closed}`,我们就可以关闭连接了。 在使用`gen_tcp`模块时,我们需要注意以下几点: - 为了避免阻塞,在发送和接收数据时,我们可以使用`gen_tcp:send/2`和`gen_tcp:recv/2`函数的阻塞模式,即将第二个参数设置为`0`。这样,如果没有数据可发送或接收,函数就会马上返回。 - 如果我们需要发送和接收大量的数据,应该使用`{packet, N}`选项来打包数据。这个选项会将数据分成大小为N的块,并且在每个块前面添加4个字节的头部,用于表示这个块的大小。这样可以避免粘包问题。 - 在发送和接收数据时,我们应该按照服务端和客户端的协议来组织数据包。如果协议有变化,我们也需要修改代码来适应新的协议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值