|
@@ -47,6 +47,7 @@ start_link() ->
|
|
|
|
|
|
init([]) ->
|
|
|
ets:new(users_rps_counters_table, [set, named_table, { keypos, 1 }, private]), % Key = {Timestamp, User_Id}
|
|
|
+ self() ! clean_ets_cache,
|
|
|
|
|
|
State = [],
|
|
|
{ok, State}.
|
|
@@ -73,6 +74,13 @@ handle_cast(_Req, State) ->
|
|
|
{noreply, State}.
|
|
|
|
|
|
|
|
|
+handle_info(clean_ets_cache, State) ->
|
|
|
+ erlang:send_after(5000, self(), clean_ets_cache),
|
|
|
+
|
|
|
+ ok = clean_ets_cache_h(ets:first(users_rps_counters_table), get_timestamp_now() ),
|
|
|
+ {noreply, State};
|
|
|
+
|
|
|
+
|
|
|
handle_info(_Request, State) ->
|
|
|
{noreply, State}.
|
|
|
|
|
@@ -85,6 +93,26 @@ code_change(_OldVsn, State, _Extra) ->
|
|
|
{ok, State}.
|
|
|
|
|
|
|
|
|
+%% helpers
|
|
|
get_timestamp_now() ->
|
|
|
erlang:system_time(second).
|
|
|
|
|
|
+
|
|
|
+clean_ets_cache_h({Time, _User_Id} = Key, Timestamp_Now) ->
|
|
|
+ Next = ets:next(users_rps_counters_table, Key),
|
|
|
+ case Time < Timestamp_Now of
|
|
|
+ true ->
|
|
|
+ ets:delete(users_rps_counters_table, Key);
|
|
|
+ _ ->
|
|
|
+ skip
|
|
|
+ end,
|
|
|
+ clean_ets_cache_h(Next, Timestamp_Now);
|
|
|
+
|
|
|
+%%clean_ets_cache_h('$end_of_table', _Timestamp_Now) -> ok;
|
|
|
+clean_ets_cache_h(_, _) ->
|
|
|
+ io:format("ets rows number after clean: ~p~n", [check_ets_count()]),
|
|
|
+ ok.
|
|
|
+
|
|
|
+
|
|
|
+check_ets_count() -> ets:info(users_rps_counters_table, 'size').
|
|
|
+
|