单纯做技术讨论,使用 PG 数据库实现一个分布式锁。仅考虑锁的正确性,不考虑可重入等功能。我的想法如下。
create table distribute_locks
(
id varchar not null primary key,
expire_at timestamptz not null,
created_at timestamptz not null default current_timestamp,
updated_at timestamptz not null default current_timestamp
);
insert into distribute_locks (id, expire_at)
values (:id, now() + interval '1 minute')
on conflict (id)
do update set expire_at = now() + interval '1 minute'
where distribute_locks.expire_at < current_timestamp
returning id
有内容返回时获取锁成功,否则获取锁失败
update distribute_locks
set expire_at = now() + interval '1 minute'
where id = :id and expire_at > current_timestamp
只有锁存在且过期才能续期,否则续期无效
delete from distribute_locks
where id = :id
这样设计的锁能满足基本需求了,但还有一个问题没有解决,即如何稳定续期。
问题点在于,如果我在获取到锁时启动一个线程去续期,那如果当前线程结束,没有主动释放锁。该续期线程要如何结束呢?
我用的是 python 来做
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.