postgresql - 使用 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刷新信号量)
谢谢!
解决方案
推荐阅读
- elixir - 在 Elixir/Ecto 中,如何在给定时区将现有 naive_datetime 字段的默认值更改为现在?
- javascript - 为什么我的不和谐机器人似乎听不到?
- selenium - 硒,请帮我看看
- python - 从 numpy 数组中提取数据的子集
- sql-server - Sql server 表:创建分区?
- python - 如何使输入成为 python 脚本的一部分,以便每次打开程序时都将永远显示输入?
- github - 如何连接 SSH 密钥并修复错误的配置选项 ssh-ed25519?
- optimization - 具有非线性约束的多体哈密顿量的八度最小化
- javascript - Odoo 销售点:添加按钮以打印不同的收据格式?奥多 13
- roblox - Roblox:如果玩家没有正确完成任务,如何杀死他们?