一、为什么使用分布式锁
二、Redis 分布式锁实现
1、Java客户端现有问题
在程序运行结束和释放锁的两步操作中会存在时间窗口,可能存在线程不安全问题
2、使用Lua脚本实现
-- 目标:获取缓存值,如值与预期相等,则释放分布式锁
-- Lua 内置了一个 redis 对象,其中 call 方法是调用 redis 相关的命令
-- 内置了 KEYS ARGV 两个数组,用来演示传递参数
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end