- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 elixir 应用程序中有一个 ets
集合表。我需要清理 updated_at 字段超过 10 秒的记录。有没有一种方法可以设置过期或手动设置而不遍历所有记录?我根据大于给定时间的时间戳匹配记录。
示例记录:
key: key_1
record: %{id: key_1, updated_at: ~N[2018-12-19 10:08:47.803075]}
到目前为止我有这段代码
def clean_stale(previous_key) do
if previous_key == :"$end_of_table" do
:ok
else
device = get(previous_key)
next_key = :ets.next(__MODULE__, previous_key)
if NaiveDateTime.diff(NaiveDateTime.utc_now, device.last_recorded_at) > 10 do
remove(device.id)
end
clean_stale(next_key)
end
end
最佳答案
如果您将“更新时间”存储为整数而不是 NaiveDateTime
结构,您可以使用匹配规范。
例如,获取当前时间作为自 Unix 纪元以来的秒数:
> DateTime.to_unix(DateTime.utc_now())
1545215338
你可以这样做:
iex(3)> :ets.new(:foo, [:public, :named_table])
:foo
iex(4)> :ets.insert(:foo, {:key1, DateTime.to_unix(DateTime.utc_now())})
true
iex(5)> :ets.insert(:foo, {:key2, DateTime.to_unix(DateTime.utc_now())})
true
iex(6)> :ets.tab2list(:foo)
[key2: 1545215144, key1: 1545215140]
iex(7)> :ets.select_delete(:foo, [{{:_, :"$1"}, [{:<, :"$1", 1545215144}], [true]}])
1
iex(8)> :ets.tab2list(:foo)
[key2: 1545215144]
在调用 ets:select_delete/2
时, 我通过一个 match specification .它由三部分组成:
{:_, :"$1"}
,我对表中的记录执行匹配。在这个例子中,我有一个包含两个元素的元组。我忽略了带有 :_
的键, 并将时间戳分配给具有 :"$1"
的匹配变量.[{:<, :"$1", 1545215144}]
,我指定我只想匹配时间戳在这个时间之前的记录。在您的情况下,您将计算过去十秒的时间并将该值放在这里。[true]
,我指定我要返回 true
用于匹配记录,在 select_delete
的情况下意思是“删除这条记录”。所以在调用select_delete
之后, 只有第二条记录保留在表中。
如果时间戳在 map 内部,您可以使用 map_get
访问它并比较它:
:ets.select_delete(:foo, [{{:_, :"$1"},
[{:<, {:map_get, :updated_at, :"$1"}, 1545215339}],
[true]}])
或者(在 Erlang/OTP 18.0 及更高版本中)匹配映射值:
:ets.select_delete(:foo, [{{:_, #{updated_at: :"$1"}},
[{:<, :"$1", 1545215339}],
[true]}])
关于erlang - 从 ets 表中删除日期戳早于 10 秒的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53848991/
我有一个 javascript 函数,可以执行以下操作; 它将日期编辑框设置为与另一个日期编辑相同的日期。但是我希望它将 txt_Testin
我有一个输入框,类型为“时间”。我想将迟到时间 (23:00pm) 作为最小值,将早期时间 (6:00am) 作为最大值 - 创建一个 23pm - 6am 的范围。 (即中午 11 点、中午 12
使用 Joda 时间并获得类似以下行为的最简单方法是什么: public boolean check( DateTime checkTime ) { DateTime someTime = n
我想计算 updated_at 比 created_at 早 2 小时的记录。 代码 $teLang = $kentekens->where('updated_at', '>', 'created_a
我是一名优秀的程序员,十分优秀!