使用Redis中Lua脚本
在一个脚本中编写多条Redis命令,确保多条命令的原子性
使用JAVA执行脚本
用RedisTemplate中的excute api
将脚本写在.lua文件里
在实现类中初始化lua脚本 读取文件中的指令
private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;
static{
UNLOCK_SCRIPT = new DefaultRedisScript<>();
UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
UNLOCK_SCRIPT.setResultType(Long.class);
}
@Override
public void unlock() {
stringRedisTemplate.execute(UNLOCK_SCRIPT,
Collections.singletonList(kEY_PREFIX + name),
ID_PREFIX + Thread.currentThread().getId());
}
总结分布式锁:
实现思路:
利用set nxex获取锁,并设置过期时间,保存线程标示
释放锁时先判断线程标示是否与自己一致,一致则删除锁
特性:
利用setnx满足互斥性
利用set ex保证故障时锁依然能释放,避免死锁,提高安全性
利用Redis集群保证高可用和高并发特性