Redis 中如何实现分布式锁?

📅 2026/7/16 21:26:56
Redis 中如何实现分布式锁?
面试加锁流程客户端执行SET lock_key uuid EX 30 NXRedis 检查lock_key是否存在不存在则设置成功返回OK加锁成功已存在则返回nil加锁失败解锁流程客户端执行 Lua 脚本GET lock_key获取当前值判断值是否等于自己的uuid相等则DEL lock_key解锁成功不相等则返回0说明锁不是自己的加锁命令SET lock_key uuid EX30NX解锁 Lua 脚本ifredis.call(GET,KEYS[1])ARGV[1]thenreturnredis.call(DEL,KEYS[1])elsereturn0endJava 代码实现publicclassRedisLock{privateJedisjedis;privateStringlockKey;privateStringuuid;privateintexpireTime30;// 秒publicbooleantryLock(){uuidUUID.randomUUID().toString();Stringresultjedis.set(lockKey,uuid,SetParams.setParams().nx().ex(expireTime));returnOK.equals(result);}publicvoidunlock(){Stringscriptif redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end;jedis.eval(script,Collections.singletonList(lockKey),Collections.singletonList(uuid));}}