答案1
因为我从一位维护人员那里得到了答案,所以我在这里回答我自己的问题Github。
Redis 本身并不能保证这一点,但是我们当前正在使用的用于任务的库(RQ)确实在一定程度上保证了操作的顺序,因为每个工作者一次只能处理一个作业。
对于大多数情况(包括自定义字段),这不是一个问题,因为所有数据库写入都发生在事务中,因此同时更新同一对象的竞争条件实际上不可能发生。
IP 地址对象的并发写锁有所不同。这是因为 Nautobot 中的功能允许同时从网络前缀请求空闲地址空间(例如“给我 192.168.0.0/24 中的下 10 个可用 IP...”),并立即分配请求返回的任意数量的空闲地址(例如“...并分配它们”)。为此,查询返回的 IP 列表会立即写回到数据库,创建新的 IPAddress 对象,从而将它们从空闲池中删除。
IPAddress 对象没有唯一性约束,因此如果没有此显式写入锁定,两个调用者可能会从同一块请求 IP,接收相同的空闲地址,并尝试分配重复的 IP。这违反了最小惊讶原则,但并未违反数据模型,因此此处的 Redis 写入锁定是保持合理预期的关键:第一个接收锁定的调用者将分配 IP,而下一个调用者要么收到正确的列表,要么无法分配地址,因为它们不再空闲。
我希望这回答了你的问题!