分布式锁的使用场景
高并发场景下对共享资源的写操作(多进程情况下),保证同一时间只有一个线程执行同步代码块。
Redis实现分布式锁
incr key 原子加
decr key 原子减
思路:执行incr key 返回1 则获取到锁,执行完业务逻辑后decr key 原子减(也可用setnx),为了避免死锁,用try finally,超时时间
问题1:A业务逻辑执行时间若超过超时时间,锁会释放掉,B获取锁,待A执行完会释放完B的锁,导致并发问题。
解决:执行业务逻辑时,开启后台线程,监听业务逻辑是否完成,如果没有完成,则重置超时时间。
redisson框架(解决了自旋问题):redisson.getLock 获取的是重入锁,key保存了hashcode和重入次数
问题2:主库挂掉,锁还没有同步到从库上去
解决:用zookeeper,保证一致性,同步机制,ZAB协议:1.全局串行化的写操作 2.保证同一客户端的指令被FIFO执行
如何提高并发?
将业务逻辑分段,比如说库存分为10份,参考jdk1.7中ConcurrentHashMap的实现