2014-01-08 71 views
2

在設置我的標準牛仔web處理例程之前,我在我的開始(_StartType,_StartArgs) - >函數中初始化一個已命名的ets表。ets是否提供了一種方法來一次執行更新和讀取 - 就像增量操作一樣?

ETS:新的(req_stats,[named_table,公共]),ETS:插(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}] = ETS:查找(req_stats,req_count)可能是更新幾次,然後我才返回Cnt + 1

是否提供了一種方法來執行更新&一次讀取 - 就像增量操作一樣?

謝謝。

回答

8

您可以使用ets:update_counter/3

ets:update_counter(req_stats, req_count, {2, 1}) 

也就是說,加1元組的第二個元素,並返回新值。


在二郎/ OTP 18.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}] 
+0

謝謝!只是一個快速編輯,ets表必須公開我的工作方式,除了update_counter工作正常。 –

+0

只是想檢查是否有可能也插入一個密鑰與默認值。或者如何update_counter與默認工作 –

+0

@OlegTarasenko當我第一次寫答案是不可能的,但現在它是:)我用一個例子更新了答案。 – legoscia

相關問題