[elixir! #0032] 在 elixir 中使用 ets (2) ---- 匹配查询

news/2024/6/30 6:17:48

上次我们介绍了 ets 表的基本配置方法, 这次我们将通过 phoenix pubsub 的源码来了解 ets 中的一些其他操作方法.

新建 ets 表

    ^local = :ets.new(local, [:duplicate_bag, :named_table, :public,
                              read_concurrency: true, write_concurrency: true])
    ^gc = :ets.new(gc, [:duplicate_bag, :named_table, :public,
                        read_concurrency: true, write_concurrency: true])

这里 ets 表中元素允许重复的 bag, 同时允许并发读写, 最大限度提升性能.

插入新数据

    true = :ets.insert(gc, {pid, topic})
    true = :ets.insert(local, {topic, {pid, opts[:fastlane]}})

新的数据以 {key, value} 的形式插入.

匹配并删除

    true = :ets.match_delete(gc, {pid, topic})
    true = :ets.match_delete(local, {topic, {pid, :_}})

匹配 ets 表中的数据, 允许使用 :_ 作为通配符.

查询某个 key 对应的 bag 中的某个位置的元素

      shard
      |> local_for_shard(pubsub_server)
      |> :ets.lookup_element(topic, 2)

因为是 duplicate_bag, 所以会检索 key 对应的每个 bag, 并返回一个列表, 包含每个 bag 中的第二个元素(位置从 1 开始). 如果 key 不存在, 则会报 :badarg 的错误.

匹配并返回特定的元素的列表

    shard
    |> local_for_shard(pubsub_server)
    |> :ets.select([{{:'$1', :_}, [], [:'$1']}])
    |> Enum.uniq

这与 lookup_element 类似, 不同的是这不需要提供确切的 key, 而是通过模式匹配来筛选. 例如返回 ets 表中的所有 key.


http://www.niftyadmin.cn/n/1898898.html

相关文章

LESS CSS 实例

值得参考的 10 个 LESS CSS 实例 2收藏(185)LESS, Sass 和其他 CSS 预处理器是一种超棒的方法用来扩展 CSS 功能,使之更适合程序员。你可以使用变量、函数、混合、继承等多种编程常用方法来编写 CSS,以更少的代码完成更多的样式。 学习这些工具最好的方…

QT配置文件入门

QT配置文件入门 学习QT才两个月,没什么经验,一点点小心得。希望大家多指点。 // -------------------------------------------------------------------------------- 用了一段时间的Qt了,对其.pro的配置文件比较感兴趣,就像以…

前端面试题(下)

小结放在前,金三银四找工作高峰期,很荣幸的在这个时间段找到一家合适自己的公司,也希望还没找到工作的朋友尽快找到合适自己的公司。下面分享一些这几天看的一些知识点。一、JavaScript 数组方法对比 I. 新增:影响原数组 使用 arr…

POJ 2311 Cutting Game [Multi-SG?]

传送门 题意:n*m的纸片,一次切成两份,谁先切出1*1谁胜 Multi-SG? 不太一样啊 本题的要求是后继游戏中任意游戏获胜就可以了.... 这时候,如果游戏者发现某一单一游戏他必败他就不会再玩了 $2*2,2*3,3*3$都不会再玩了(除…

qmake

转载地址:http://dxwang.blog.51cto.com/384651/296247 简单的说qmake给大家提供了一个适合各个平台(当然最好是QT啦)的makefile生成器 1 介绍qmakeqmake是用来为不同的平台的开发项目创建makefile的Trolltech开发一个易于使用的工具。qmake简化了makefile的生成&a…

jQuery重置表单

最近有个需求想要重置一下表单,本以为: $("#xxx").reset()就可以了,因为联想到$("#xxx").submit()是可以提交的嘛,结果一把辛酸泪。 后来网上查了一下,酱紫不行的,因为jQuery中没有重置…

qmake教程介绍

转载地址:http://blog.chinaunix.net/uid-14414741-id-2814024.html qmake教程介绍这个教程可以教会你如何使用qmake。我们建议你看完这个教程之后读一下qmake手册。开始很简单让我们假设你已经完成了你的应用程序的一个基本实现,并且你已经创建了下述文…

Oracle开启并行的几种方法

并行执行是同时开启多个进程/线程来完成同一个任务,并行执行的每一个进程/线程都会消耗额外的硬件资源,所以并行执行的本质就是以额外的硬件资源消耗来换取执行时间的缩短。这里的额外硬件资源消耗是指对数据库服务器上多个CPU、内存、从个I/O通道&#…