mnesia に カウンターを扱う関数があるので使って見たメモ。
- レコードが無ければ作ってくれる
- 加算後の値を返してくれる
$ erl
Erlang/OTP 17 [erts-6.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Eshell V6.1 (abort with ^G)
1> mnesia:start().
ok
2> rd(store, {key, value}).
store
3> mnesia:create_table(store, []).
{atomic,ok}
4> mnesia:dirty_update_counter(store, <<"spam">>, 1).
1
5> mnesia:dirty_update_counter(store, <<"spam">>, 1).
2
6> mnesia:dirty_update_counter(store, <<"spam">>, 1).
3
7> mnesia:dirty_update_counter(store, <<"spam">>, 1).
4
8> mnesia:dirty_read(store, <<"spam">>).
[#store{key = <<"spam">>,value = 4}]
9> mnesia:dirty_update_counter(store, <<"egg">>, 1).
1
10> mnesia:dirty_read(store, <<"egg">>).
[#store{key = <<"egg">>,value = 1}]
10> timer:tc(fun() -> mnesia:dirty_update_counter(store, <<"spam">>, 1) end).
{45,6}
シングルノードであれば 45 マイクロセカンドと高速です。ただ ets だと一桁台なので、カウンターの性能に引っ張られる可能性もありますね。
Top comments (0)