【问题标题】:How to set expiry of records in Mnesia如何在 Mnesia 中设置记录到期
【发布时间】:2019-07-13 11:24:16
【问题描述】:

我正在使用脏写向 mnesia 写入记录

:mnesia.dirty_write({Table_Name, id, Node.self(), timestamp, msg})

我想删除超过 1 小时的记录,如何设置 Expiry 或 TTL?

【问题讨论】:

  • 创建一个事务并在事务中对旧记录使用选择和删除。但是使用 mnesia:async_dirty 函数运行该事务的乐趣
  • @Pouriya 我们可以在写入 mnesia 时设置记录的到期时间吗?例如这样的 - :mnesia.dirty_write({Table_Name, id, Node.self(), timestamp, msg}, expiry: 1 hour)
  • 没有。您应该为此启动一个新流程,并每分钟完成我提到的上述任务

标签: erlang elixir mnesia


【解决方案1】:

Mnesia 没有对记录到期/TTL 的内置支持。您必须自己实现此功能,例如定期扫描表以查找过期记录并删除它们。

【讨论】:

    【解决方案2】:

    由于 mnesia 没有任何 ttl 机制(至少我找不到),我编写了一个 gen 服务器,它从 mnesia 中删除超过 1 小时的所有记录。此 gen 服务器每 1 小时激活一次,删除旧记录并返回睡眠状态。这里是逻辑的代码sn-p

      {:atomic, list} =
        :mnesia.transaction(fn ->
          :mnesia.select(Table_Name, [
            {{Table_Name, :"$1", :"$2", :"$3", :"$4", :"$5", :"$6", :"$7", :"$8", :"$9", :"$10"},
             [{:<, :"$3", cutoff_time}], [:"$$"]}
          ])
        end)
    
      for record <- list do
        [id, _, _, _, _, _, _, _, _, _] = record
        :mnesia.dirty_delete(Table_Name, id)
      end
    

    注意 - 表中的每条记录都有 10 个字段,第一个字段 (id) 是键。参数$3是时间戳,截止时间=当前时间戳-1小时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-23
      • 2017-01-14
      • 2019-07-23
      • 2010-09-08
      • 2019-02-20
      • 2011-09-05
      • 2011-12-06
      • 2023-01-31
      相关资源
      最近更新 更多