Erlang unique_integer returns 重启后相同的整数
Erlang unique_integer returns the same integer after restart
我需要给我的记录编号,这样我就可以随时比较 "later" 和 "before"。
为此,我使用了 unique_integer
函数:
Tag = erlang:unique_integer([monotonic]),
然后我会比较任意两个事件:
Event1.tag < Event2.tag
表示事件 1 在事件 2 之前发生。
但是,当我重新启动 erlang 节点时,它又从开始编号:
event1 -5555
event2 -5554
event3 -5553
-- restart the system
event4 -5555
event5 -5554
event6 -5553
现在我的排序没有按预期工作。
有什么方法可以生成长序列号,在重启后从中断处继续?
P.S.: 如果有用,我正在使用mnesia来存储我的事件,所以我需要增加行号来记录。
erlang:unique_integer() -> integer()
Generates and returns an integer unique on current runtime system instance. The same as calling erlang:unique_integer([]).
所以您所看到的与定义的行为一致。
我不清楚你需要这个做什么,正确的解决方案取决于你的具体需求。假设您有事件快速进入并且您计划使用 ordered_set
按到达时间将它们存储在 Mnesia 中,我可以想到一些方法:
- 只有一个进程负责插入。它可以使用 table 中的最大 ID 进行初始化,并在每次插入时递增。
- 使用
erlang:system_time(nano_seconds)
生成一个唯一的密钥
- 使用
{erlang:system_time(nano_seconds), make_ref()}
生成密钥以确保唯一性,即使时间戳相同
如果您预计不会在不到一秒内重新启动,请使用 {erlang:system_time(seconds), erlang:unique_integer([monotonic])}
。否则 {erlang:system_time(), erlang:unique_integer([monotonic])}
是安全的选择。
您可以在系统或进程启动时存储 erlang:system_time(秒)的值并保存调用 erlang:system_time/0,1
。
这是我要找的功能:mnesia:dirty_update_counter
。
感谢这个 excellent post 关于此事:
mnesia:dirty_update_counter(unique_ids, record_type, 1),
io:format("Id => ~p~n", [Id]),
Id1 = mnesia:dirty_update_counter(unique_ids,record_type, 1),
io:format( "Id => ~p~n", [Id1]),
Id2 = mnesia:dirty_update_counter(unique_ids, another_type, 1),
io:format("Id => ~p~n", [Id2]),
The output you will get is
Id => 1
Id => 2
Id => 1
A single table can be used to generate the unique ids for other
tables. In this example, unique ids are generated for record_type and
another_type. Posted by Dude From Mangalore at 3:19 PM
我需要给我的记录编号,这样我就可以随时比较 "later" 和 "before"。
为此,我使用了 unique_integer
函数:
Tag = erlang:unique_integer([monotonic]),
然后我会比较任意两个事件:
Event1.tag < Event2.tag
表示事件 1 在事件 2 之前发生。
但是,当我重新启动 erlang 节点时,它又从开始编号:
event1 -5555
event2 -5554
event3 -5553
-- restart the system
event4 -5555
event5 -5554
event6 -5553
现在我的排序没有按预期工作。
有什么方法可以生成长序列号,在重启后从中断处继续?
P.S.: 如果有用,我正在使用mnesia来存储我的事件,所以我需要增加行号来记录。
erlang:unique_integer() -> integer()
Generates and returns an integer unique on current runtime system instance. The same as calling erlang:unique_integer([]).
所以您所看到的与定义的行为一致。
我不清楚你需要这个做什么,正确的解决方案取决于你的具体需求。假设您有事件快速进入并且您计划使用 ordered_set
按到达时间将它们存储在 Mnesia 中,我可以想到一些方法:
- 只有一个进程负责插入。它可以使用 table 中的最大 ID 进行初始化,并在每次插入时递增。
- 使用
erlang:system_time(nano_seconds)
生成一个唯一的密钥 - 使用
{erlang:system_time(nano_seconds), make_ref()}
生成密钥以确保唯一性,即使时间戳相同
如果您预计不会在不到一秒内重新启动,请使用 {erlang:system_time(seconds), erlang:unique_integer([monotonic])}
。否则 {erlang:system_time(), erlang:unique_integer([monotonic])}
是安全的选择。
您可以在系统或进程启动时存储 erlang:system_time(秒)的值并保存调用 erlang:system_time/0,1
。
这是我要找的功能:mnesia:dirty_update_counter
。
感谢这个 excellent post 关于此事:
mnesia:dirty_update_counter(unique_ids, record_type, 1), io:format("Id => ~p~n", [Id]), Id1 = mnesia:dirty_update_counter(unique_ids,record_type, 1), io:format( "Id => ~p~n", [Id1]), Id2 = mnesia:dirty_update_counter(unique_ids, another_type, 1), io:format("Id => ~p~n", [Id2]),
The output you will get is
Id => 1 Id => 2 Id => 1
A single table can be used to generate the unique ids for other tables. In this example, unique ids are generated for record_type and another_type. Posted by Dude From Mangalore at 3:19 PM