三种思路。最省事是分布式锁:任务开始时用 Redis 的 SET 带 NX 和过期时间抢锁,抢不到就跳过本轮。
更严谨是交给调度框架,由调度中心指定一台执行;不想引中间件就用数据库,抢唯一键记录或加行锁。
锁的过期时间要给够并支持续期,否则任务没跑完锁先过期,第二个实例就进来了。
任务本身尽量做成幂等。
SET lock:order:sync <instance-id> NX PX 300000
# 释放锁必须比对 value,避免误删别人的锁
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
end
THE END






暂无评论内容