erlang:make_ref与erlang:唯一整数

juud5qan  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(202)

是否有经验法则来决定何时何地更喜欢erlang:make_ref/0而不是erlang:unique_integer/0,1
make_refs上的大多数例子似乎都是关于消息或请求的。在这些情况下,引用是短暂的,可以用unique_integer替换make_refs而不会有太多麻烦。
在速度或保证方面是否存在差异?当试图识别将持久化和/或与其他系统交换的长期对象或数据时,是否应该优先选择其中一个?

nzk0hqpo

nzk0hqpo1#

unique_integer([monotonic])需要在调度器之间同步,因此它们比非单调unique_integermake_ref慢。
非单调unique_integermake_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组合成一个更大的整数。强随机性和它自己的名字的散列......这完全取决于您的用例的要求。

相关问题