gpt4 book ai didi

erlang:make_ref 与 erlang:unique_integer

转载 作者:行者123 更新时间:2023-12-02 15:50:11 26 4
gpt4 key购买 nike

对于何时何地优先使用 erlang:make_ref/0 而不是 erlang:unique_integer/0,1 或相反,是否有任何规则?

make_refs 上的大多数示例似乎都围绕消息或请求。在这些情况下,引用的生命周期很短,make_refs 可以轻松换成 unique_integer。

在速度或保证方面有区别吗?在尝试识别将持久保存和/或与其他系统交换的长生命周期对象或数据时,是否应该优先选择另一个?

最佳答案

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 组合成一个更大的整数。或者,您可以让每个节点生成自己的 node-id,结合开始时间、强随机性和自己名称的哈希值……这完全取决于您的用例要求。

关于erlang:make_ref 与 erlang:unique_integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72747127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com