概述目标:在并发场景下以原子加锁/解锁与续约机制避免锁竞争与误释放,保障任务独占执行。适用:订单去重、库存扣减、定时任务幂等、单用户会话互斥等。核心与实战获取锁(带过期与唯一值):SET lock:order:123 8b3d2e80-2b3b-4b8b-bf01-2c9f NX PX 30000 -- 返回OK表示获得锁 自动续约(在持有期间定期续期):PEXPIRE lock:order:123 30000 原子解锁(比较值后删除):-- Lua脚本确保只有持有者可释放 local key = KEYS[1] local val = ARGV[1] if redis.call('GET', key) == val then return redis.call('DEL', key) else return 0 end 续约守护逻辑(示意):-- 定时(如每10s)检查锁仍由自身持有,若持有则PEXPIRE延长TTL;任务结束后执行原子解锁脚本 示例加锁与解锁:SET lock:job:sync abc-uuid NX PX 15000 EVAL "local k=KEYS[1]; local v=ARGV[1]; if redis.call('GET',k)==v then return redis.call('DEL',k) else return 0 end" 1 lock:job:sync abc-uuid 观察TTL与持有状态:PTTL lock:job:sync GET lock:job:sync 验证与监控键空间与资源:INFO keyspace MEMORY STATS 高可用部署:单实例锁有故障窗口;如需跨实例容灾需谨慎评估Redlock并结合业务补偿与去重。客户端健壮性:任务取消/崩溃时确保不再续约,依赖TTL自动释放。常见误区解锁直接`DEL`不校验持有者值,可能误解锁其他实例;必须使用Lua脚本比较值再删除。续约与业务临界区未隔离导致释放后仍继续执行;应在持锁条件下执行关键逻辑并设置合理TTL与续约间隔。使用无限期锁而无TTL导致死锁;锁必须设置过期时间并有续约机制。结语通过SET NX PX + Lua原子解锁与续约守护,可在多数业务场景实现安全分布式锁,配合监控与补偿策略提升可靠性。

发表评论 取消回复