分布式项目使用分布式锁来解决高并发问题
正常思路:使用synchronized锁住当前对象(即this),或使用ReentrantLock加锁!!
问题:以上几种锁都是jvm级别的加锁,项目使用集群搭建的时候,由nginx转发给多个服务,
此时每个服务都会由一个独立的tomcat来执行程序,即每个服务都有一个JVM,高并发情况无法成功实现秒杀问题,可能会出现 订单 大于 库存 情况!!!
解决: 使用分布式锁,例:Redis实现分布式锁!
使用redis setnx命令
痛点:
使用setnx命令一定要设置过期时间,因为主动通过delete删除的话会有问题
问题1:
未设置过期时间,主动delete key,有可能中间java逻辑处理会出现异常,
此时可以通过 try。。。finally来解决
String key = "produntName";
reidsUtils.setnx(key, value);
try{
//...处理逻辑
}finally{
redisUtils.delete(key);
}