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

上次我们介绍了 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.

    原文作者:LJZN
    原文地址: https://segmentfault.com/a/1190000008716523
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞