前几天,被问到并发操作如何解决一条数据被请求多次处理事件的技术解决方案,当时只有一点印象,利用锁机制,但是读写锁对于分布式部署的项目来说是无法实现的。事后去查看博友们提供的技术方案。决定基于redis自己尝试写一个分布式锁来实现多线程操作。类似一个秒杀功能吧,这里有个问题就是其实并不是线程抢到了 就一定能秒杀成功。有可能此时正在被写,处于锁的状态。当执行结束,下个线程再赋予一个自己的锁进行写操作。所以秒杀活动并不是越快越好,也有一定的随机机制。这是我的个人理解,希望不对的博友指出,下面是redis锁实现的代码
@Component public class RedisLockUtil { @Autowired private RedisService redisService; public boolean lock(String key,Integer hours,String value){ redisService.set(key,value,hours, TimeUnit.HOURS); return false; } public boolean unlock(String key,String value){ String object = redisService.get(key); if(null == object){ return false; }else{ if(value.equals(object)){ redisService.delete(key); return true; }else{ return false; } } } public boolean releaseLock(String key){ String object = redisService.get(key); if(null == object){ return false; }else{ redisService.delete(key); return true; } } public boolean isLocked(String key){ synchronized (key){ Long time = Long.getLong(redisService.get(key)); if(null == time){ return false; }else{ Date now = new Date(); Date timeout = new Date(time); if(now.before(timeout)){ return true; } } return false; } } }