是否有经验法则来决定何时何地更喜欢erlang:make_ref/0而不是erlang:unique_integer/0,1?make_refs上的大多数例子似乎都是关于消息或请求的。在这些情况下,引用是短暂的,可以用unique_integer替换make_refs而不会有太多麻烦。在速度或保证方面是否存在差异?当试图识别将持久化和/或与其他系统交换的长期对象或数据时,是否应该优先选择其中一个?
erlang:make_ref/0
erlang:unique_integer/0,1
nzk0hqpo1#
unique_integer([monotonic])需要在调度器之间同步,因此它们比非单调unique_integer或make_ref慢。非单调unique_integer和make_ref使用类似的方式来构造它们自己,使用每个调度程序专用的池。但是,unique_integer池总是以相同的值开始,而引用池使用当前时间作为种子。此外,unique_integer的保证只与当前节点相关,你可以连续运行erl -eval 'io:format("~p", [erlang:unique_integer()]),init:stop().'多次,你会看到重复的值,因此,如果你有一个簇,整数可能不是唯一的。另一方面,由于引用包括创建它们的节点,因此它们在集群中的连接节点之间是唯一的。当使用持久化数据时,您需要考虑可能的Erts重启,因此您不能很好地保证时间上的唯一性。尽管使用引用可能已经足够了(正如我已经展示的,当考虑节点重启时,unique_integer不够强),也许您应该使用不同的策略,比如让持久化层在您存储数据时为您创建id(MySQL中的AUTOINC)。但是您可以根据需要混合和匹配它们。(我们称之为node-id),并将其与unique_integer组合成一个更大的整数。强随机性和它自己的名字的散列......这完全取决于您的用例的要求。
unique_integer([monotonic])
unique_integer
make_ref
erl -eval 'io:format("~p", [erlang:unique_integer()]),init:stop().'
node-id
1条答案
按热度按时间nzk0hqpo1#
unique_integer([monotonic])
需要在调度器之间同步,因此它们比非单调unique_integer
或make_ref
慢。非单调
unique_integer
和make_ref
使用类似的方式来构造它们自己,使用每个调度程序专用的池。但是,unique_integer
池总是以相同的值开始,而引用池使用当前时间作为种子。此外,
unique_integer
的保证只与当前节点相关,你可以连续运行erl -eval 'io:format("~p", [erlang:unique_integer()]),init:stop().'
多次,你会看到重复的值,因此,如果你有一个簇,整数可能不是唯一的。另一方面,由于引用包括创建它们的节点,因此它们在集群中的连接节点之间是唯一的。
当使用持久化数据时,您需要考虑可能的Erts重启,因此您不能很好地保证时间上的唯一性。尽管使用引用可能已经足够了(正如我已经展示的,当考虑节点重启时,
unique_integer
不够强),也许您应该使用不同的策略,比如让持久化层在您存储数据时为您创建id(MySQL中的AUTOINC)。但是您可以根据需要混合和匹配它们。(我们称之为
node-id
),并将其与unique_integer
组合成一个更大的整数。强随机性和它自己的名字的散列......这完全取决于您的用例的要求。