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来存储我的事件,所以我需要增加行号来记录。

来自the documentation

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