ETS存储数据

特点

1.ETS常驻内存,存储键值表,可以被多个进程共享。
2. 当ETS表被丢弃或控制它的erlang进程终止,ETS表中的数据就会被清除。
3. ETS表中保存元组,元组中默认第一个元素是元组的键,通过键向表里插入和提取元组。
4. ETS表分为异键表(各个元组中的键是唯一的)、有序异键表(键唯一并且元组被排序)、同键表(键可以不唯一)和副本同键表(键不唯一并且有相同的元组)

基本操作

  • 创建新表或打开现有表
    spec ets:new(Name, [Opt]) -> TableId
    Opt选项:默认情况下[Opt]为[set, prtected, {keypos, 1}]。
  1. 类型: set, ordered_set, bag, duplicate_bag
  2. private(私有表,只有创建表的进程能读取写入)、public(公共表,任何进程都可以读取写入,用户必须确保读取和写入互不冲突)、protected(受保护的表,任何进程都可以读取,只有创建表的进程才能写入)
  3. named_table,设置了此选项,Name可用于后续表的操作
  4. {keypos, K},设置元组中键的位置。
	Modes = [set, ordered_set, bag, duplicate_bag].
	lists:foreach(func(Mode) -> 
					TableId = ets:new(test, [named_table, Mode, private]) 
					end, Modes).
  • 向表中插入一个或多个元组
	ets:insert(TableId, [{a, 1}, {b, 2}]).
	ets:insert(TableId, {c, 3}).
  • 在表里查找某个元组
    lookup(TableId, Key),查询匹配Key的元组列表
  • 删除表
	ets:delete(TableId)

ETS表的效率

  • 异键表与有序异键表
    异键表使用散列表表示,插入时间恒定,有空间开销;
    有序异键表用平衡二叉树表示,插入时间为logN。
  • 同键表和副本同键表
    使用散列表表示,同键表在每次插入时需要与ETS表中所有相同键的元组比较是否相等,比副本同键表更低效。
  • 存储
    ETS表保存在单独的存储区域,与正常的内存进程无关,被创建它的进程所有,当进程挂了或者使用ets:delete,表被删除。
    插入元组时,将数据从进程栈复制到ETS表,查询表时,将找到的元组复制到进程栈。
    二进制存储在自己的堆外存储区域,可以被多个进程和ETS共享,在进程间传递二进制数据非常高效,向ETS插入包含二进制的元组也非常高效。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ETS 是什么?如果您指的是 Elixir Term Storage(ETS),那么我们可以为您提供以下示例代码,演示如何在 Elixir 中使用 ETS 进行 TCP 通信: ```elixir # 创建 TCP 服务器进程 server = spawn(fn -> # 创建 TCP 监听套接字 {:ok, socket} = :gen_tcp.listen(1234, [:binary, {:packet, :line}, :reuseaddr]) # 循环处理连接请求 loop(socket) end) # 处理连接请求 defp loop(socket) do # 接受连接请求 {:ok, client} = :gen_tcp.accept(socket) # 创建 ETS 表格用于存储连接对象 table = :ets.new(:my_table, [:named_table, {:keypos, 1}]) # 将客户端连接对象存储到表格中 :ets.insert(table, {client, self()}) # 循环处理客户端请求 client_loop(client, table) end # 处理客户端请求 defp client_loop(client, table) do # 接收客户端数据 case :gen_tcp.recv(client, 0) do {:ok, data} -> # 处理数据 handle_data(data) # 继续等待客户端请求 client_loop(client, table) {:error, :closed} -> # 客户端已关闭连接,从表格中移除连接对象 :ets.delete(table, client) end end # 处理数据 defp handle_data(data) do # 处理数据的代码 end ``` 这个示例代码创建了一个 TCP 服务器进程,监听端口 1234,并在有新连接时循环处理连接请求。每个连接对象都存储ETS 表格中,以便随时处理客户端请求。客户端请求通过 :gen_tcp.recv 函数接收,然后通过 handle_data 函数处理。如果客户端关闭连接,则从表格中移除连接对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值