0

我正在开发一个使用独角兽的 Sinatra 应用程序。每个工作者都是一个线程,它加载整个应用程序,他们只是共享数据库。(如果我错了,请纠正我;))

第一个线程获取 Integer,对其进行处理然后递增它,第二个线程不应该获取第一个线程的 Integer(线程安全),它应该只获取递增的 Integer。

我通过阻塞来做到这一点,但想找到一种更好的方法,因为在我的研究中,我经常读到这是解决我的问题的一种非常糟糕的方法,因为它的可扩展性不是很好。

如果您想查看我的整个应用程序,请随时在github上查看;)

4

1 回答 1

2

似乎您正在尝试为缩短的网址生成字母数字 ID。如果是这种情况,那么它比你想象的要简单得多

让有一个常规的自动递增 id 整数字段。当一个新的请求进来时,你在数据库中创建一条记录,获取它的 id(不会再次重复,其他工作人员也不会得到它),将其转换为字母数字形式并保存(到另一列)。

Ruby 甚至在某些情况下包含转换方法。

aid = 1746563

s = aid.to_s(36) # => "11fnn"
i = s.to_i(36) # => 1746563

您可以只使用您的方法而不是这些方法。

更新

由于您提到您使用 Posgresql,因此有一个完美的工具:序列

您可以创建一个序列,然后从中获取自动递增的数字,而不必担心另一个客户端会获得相同的值。

于 2012-10-11T13:34:16.523 回答