首页 > 解决方案 > 使用 postgres 实现过期锁(或信号量)

问题描述

我有下表

Tasks
   max_solvers int, # Maximum number of users that can solve this task (e.g. survey)
   current_solvers int[], # List of user ids that solved this task (e.g. already took the survey)
   state char[1], # If the task is solved or not, this variable can be used to show tasks to users to solve.

问题:示例:假设一个任务只能由 3 个用户解决(例如 max_solvers = 3)

因此,任何执行以下操作的查询都不起作用:

  select * from tasks where task.state = 'NOT_SOLVED'

因为我们可能会向(例如 100 个)用户展示该任务,而其中只有 3 个可以解决,而其他 97 个用户的工作将被浪费。

解决此问题的一种(可能的)方法是使用信号量。任务只能显示给 max_solvers - array_length(current_solvers)。

信号量将在大多数情况下工作。如果向用户显示了一项任务但最终没有解决(例如他们的手机死机)。有一个即将到期的信号灯会很好。

实际问题:)

是否可以使用 postgres 实现过期信号量(或过期)锁。我知道 postgres 有咨询锁,但它们不会自动过期。

此处之前讨论了一种模拟过期锁(或序列化访问)的方法

是否可以扩展该答案以实现过期信号量。

还是依靠其他可以更有效解决这个问题的系统更好(例如redis刷新信号量

谢谢!

标签: postgresqlredis

解决方案


推荐阅读