Erlang ets删除/过滤元素

时间:2015-12-22 14:34:30

标签: erlang fold ets

我使用elang ets表作为简单缓存。我想使用一个进程来扫描表并删除过期的元素(多个)。

使用ets:foldl

expire_table_example() ->
Tab = ets:new(ets_tab, [named_table, set]),
ets:insert(Tab, [{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5},{f,7}]),
Tab1 = ets:foldl(fun({Key, Val}, Acc) ->
if
   (Val > 3) -> [{Key, Val} | Acc];
   true -> Acc
 end
end, Tab, Tab),
io:format("end ~p ~n", [Tab1]).

我得到了

[{f,7},{e,5},{d,4}|ets_tab] %% the ets_tab is NOT expected.

我该如何解决这个问题?

任何其他API都可以做得更好吗?

3 个答案:

答案 0 :(得分:5)

您不能将ets表用作累加器。

出于您的目的,您可以使用ets:select_delete/2

Model.year(1986)

或者您可以使用ets:tab2list/1获取所有值的列表,过滤它们,然后重新插入到表中:

1> Tab = ets:new(ets_tab, [named_table, set]).
ets_tab
2> ets:insert(Tab, [{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5},{f,7}]).
true
3> ets:select_delete(Tab, [{{'$1','$2'},[{'=<','$2',3}],[true]}]).
3
4> ets:tab2list(Tab).
[{f,7},{e,5},{d,4}]

答案 1 :(得分:0)

另一种方法是使用 list comprehensions

1> Tab = ets:new(ets_tab, [named_table, set]).
ets_tab   
2> ets:insert(Tab, [{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5},{f,7}]).    
true    
3> [{X,Y} || {X,Y} <- ets:tab2list(Tab), Y>3].    
[{f,7},{e,5},{d,4}]

答案 2 :(得分:0)

您可能会发现定期删除大量对象可能会导致 在不期望的延迟峰值。 有一个有趣的项目将缓存段作为单独的ets表 通过删除整个ets删除过时的对象,也许你会觉得它很有趣

https://github.com/fogfish/cache