ets

ets基础:

1、ets和dets基本是做统一件事情:提供大型的“键-值”搜索表。ets驻留在内存,dets驻留在磁盘。

2、ets和dets可以被多个进程共享。

3、ets和dets表的结构数据是“键-值”对。我们在表的最常用的操作是插入和查找。一个ets和dets表其实就是一系列erlang元祖。

4、ets中的数据是临时存储的,这意味着当数据被释放的时候,响应的数据也被丢弃。而dets的数据存储是持久的。

5、ets表可以在需要高效操纵海量数据的场合都可以大显身手。

6、ets和dets表存储元祖。元组中的一个元素(默认为第一个元素)称作表的键。

7、表的类型: set,要求所有的元组键值各不相同;ordered set,元组进行排序; bags,允许多个元组有相同的键值,但是不能有两个完全相同的元组;duplicate bag,不仅多个元组可以有相同的键值,同一个元组也可以出现多次。

8、调用ets:new创建ets表。创建表的进程就是表的所有者。表创建后属性不能修改。如果所有者进程死掉,或者调用ets:delete时,就会自动释放表的内存空间。ETS表不在GC的管理范围内,除非拥有它的进程死掉它才会终止;可以通过delete删除数据

9、创建参数private、public、protected、named_table、{keypos, k}。

10、ETS查询时间是常量,例外是如果使用ordered_set查询时间与logN成正比(N为存储的数据量)

11、一个Erlang节点的ETS表的数量是有限制的,默认是1400个表,在启动erlang节点之前修改 ERL_MAX_ETS_TABLES参数可以修改这个限制

12、并发控制:所有针对一个对象的更新都被保证是原子的、隔离的:修改要么全部成功要么失败。也没有其它的中间结果被其它的进程使用。有些方法可以在处理多个对象的时候保证这种原子性和隔离性。

查看ets:

ets:all() 列出所有的ETS Table

ets:i() 给出一个ETS Table的清单 包含表的类型,数据量,使用内存,所有者信息

ets:i(s2s) 输出s2s表的数据,个人感觉这个非常方便比tv还要简单快捷,如果表数据量很大,它还提供了一个分页显示的功能

ets:info(s2s) 单独查看一个ETS Table的详细信息也可以使用这个方法,如果怀疑这个表被锁了可以使用ets:info(s2s,fixed)查看,ets:info(s2s,safe_fixed) 可以获得更多的信息,这样比较容易定位是哪个模块出了问题.

ets:member(Tab, Key) -> true | false 看表里面是否存在键值为Key的数据项.

ets:match/1 ets:match/2 ets:match/3

一个匹配模式也许包含的项值有:绑定部分(Erlang 项),‘_‘ 可以匹配任何 Erlang 项,和匹配变量:‘$N‘(N>=0)

函数将返回一个匹配每个对象数据的元素的列表,每个元素是一个绑定变量模式的有序列表。

时间: 2024-10-14 13:09:58

ets的相关文章

OTP&ETS

最近觉得实在是该梳理梳理erlang的框架内容了,所以整理了下. OTP(开放电信平台):并发系统平台, 特点:容错(erlang:get_stacktrace(),try-catch,trap_exit进程退出时候发送信息{'Exit',Pid,Reason},不会所有进程都崩溃而且可以由supervisor重启)--链路来容错. 监督(supervisor,重启机制). 可升级(code_change(gen_server)). 并发(spawn,消息(而非java|c的锁))--进程&消息

Erlang ETS Table

不需要显示用锁,插入和查询时间不仅快而且控制为常量,这就是Erlang的ETS Table. 为什么而设计? Erlang中可以用List表达集合数据,但是如果数据量特别大的话在List中访问元素就会变慢了;这种主要是由于List的绝大部分操作都是基于遍历完成的. Erlang的设计目标是软实时(参考:http://en.wikipedia.org/wiki/Real-time_computing),在大量数据中检索的时间不仅要快而且要求是常量.为了解决快速查 询的问题,Erlang提供的机制就

erlang中list和ets的查找

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

ets 当lists使用

Langs = ets:new(couch_query_server_langs, [set, private]),     PidProcs = ets:new(couch_query_server_pid_langs, [set, private]),     LangProcs = ets:new(couch_query_server_procs, [set, private]),     % 'query_servers' specifies an OS command-line to 

[Erlang之旅 0005] ETS 和Record

ETS 提供“键-值” 搜索表, 驻留在内存中,速度较快.是缓存的大利器. record 作为erlang的一种数据结构,通常用于函数量传递. ETS中创建表, 对数据进行增.删.改.查 , 及关闭表常用的函数 ets:new(Name, Options) -> tid()   %% 创建表 Options: Type: set | ordered_set | bag | duplicate_bag set: 每一个元组的键值都不能相同:ordered_set:元组键不能相同,并且会进行排序 b

在ets上做的自由分页

-define(PAGECOUNT,3).  %定义自己的页容量 Pre = (Page -1) * ?PAGECOUNT,  %页首 Tail = Page * ?PAGECOUNT + 1,  %页尾 Query=ets:fun2ms(fun(Data=#process_state{number=Number}) when Number > Pre andalso Number < Tail -> Data end),  %选中处于编号中的元素,number为数据号码 ets:sel

Erlang ets -- something about cache

都说用ets 写一个cache 太简单, 那就简单的搞一个吧, 具体代码就不贴了, 就说说简要的需求和怎么做(说设计有点虚的慌). 需求场景 >> 查询系统,对于主存储而言,一次写入多次查询 所以,cache 需要能实现: UserA 在查询 RecordA 时, UserB 也需要查询RecordA, 就让UserB waiting, 待UserA 查询完成之后, 共享RecordA 的查询结果. >> 限制单个ets 表的内存使用量,先进先出 那就需要个queue,求 queu

Erlang静态键值对(key-value)数据分别写入erl文件与ETS表读取的测试

1.前言 昨晚在Erlang技术交流群问了这样一个问题: 我现在有1万多条静态的key-value数据,我现在是直接生成如下代码来使用: get(key1) ->value1; get(key2) ->value2; ...... get(keyN) ->valueN. 问题: 1.有没有更高效的方式? 2.Erlang的匹配用的是什么算法? 3.在源码的何处可以看到函数匹配的实现原理? 有人建议用ETS,所以就此进行了简单测试. 2.测试代码 3.运行测试 相同的键值对数据分别写入et

Erlang --- ETS表

ETS和进程字典都是Erlang所独有的. ETS是Erlang Term Storage 的缩写,它是一个基于内存的KV( Key Value) Table,支持大数据量存储以及高效查询. 要使用ETS表,首先就要先新建ETS表. 1.ets:new(?ETS_SYS_BUILDING,[{keypos,#ets_sys_building.sysBuildingId},named_table,public,set]) 其中 ?ETS_SYS_BUILDING:是表名 {keypos,#ets_