Erlang ets是否提供了进行更新的方法&;一次读取-像增量操作一样?

Erlang ets是否提供了进行更新的方法&;一次读取-像增量操作一样?,erlang,increment,ets,Erlang,Increment,Ets,在设置标准Cowboy web处理例程之前,我在我的start(\u StartType,\u StartArgs)->函数中初始化一个命名的ets表 ets:new(req_stats,[named_table,public]),ets:insert(req_stats,{req_count,0}) 我有这个功能: count_req()-> [{_,Cnt}]=ets:lookup(req_stats,req_count), ets:insert(req_stats,

在设置标准Cowboy web处理例程之前,我在我的start(\u StartType,\u StartArgs)->函数中初始化一个命名的ets表

ets:new(req_stats,[named_table,public]),ets:insert(req_stats,{req_count,0})

我有这个功能:

 count_req()->
    [{_,Cnt}]=ets:lookup(req_stats,req_count),
    ets:insert(req_stats,Cnt+1),
    Cnt+1.
我担心的是,

如果我在高负载下为每个web请求调用count_req(),我很可能会得到一个不准确的计数,因为在返回Cnt+1之前,[{uu,Cnt}]=ets:lookup(req_stats,req_count)可能会被更新多次

ets是否提供了一种像增量操作一样一次性更新和读取的方法

谢谢。

您可以使用:

也就是说,将元组的第二个元素增加1,然后返回新值


在Erlang/OTP18.0(于2015年6月24日发布)中,引入了ets:update_counter/4。它允许您提供一个默认值,如果表中还没有键,则使用该值。因此,如果您希望计数器在第一次递增后变为1,请将0作为默认值:

1> ets:new(req_stats, [named_table]).
req_stats
2> ets:tab2list(req_stats).
[]
3> ets:update_counter(req_stats, req_count, {2, 1}, {req_count, 0}).
1
4> ets:tab2list(req_stats).
[{req_count,1}]

谢谢只需一次快速编辑,ets表就必须是公共的,以供我使用,而不是更新计数器工作正常。只是想检查是否可以插入一个默认值为的键。或者如何使用默认值更新\u计数器works@OlegTarasenko当我第一次写答案时是不可能的,但现在是:)我用一个例子更新了答案。
1> ets:new(req_stats, [named_table]).
req_stats
2> ets:tab2list(req_stats).
[]
3> ets:update_counter(req_stats, req_count, {2, 1}, {req_count, 0}).
1
4> ets:tab2list(req_stats).
[{req_count,1}]