ZooKeeper分布式锁
参考博客:ZooKeeper分布式锁
Redis分布式锁
参考博客:Redis分布式锁
分布式锁解决的问题
在单机的情况下,为防止多线程竞争同一个资源,只需要上锁即可,因为当某个线程获取到资源后,如果他不释放锁资源,其他线程就无法获取到锁资源。
在分布式环境下,每个启动起来的项目都有可能去操作同一个对象,这个时候需要去考虑如何给对象加锁,保证程序不会出错。(例如商品超卖的问题)
分布式锁的主要思想
不管是zookeeper做分布式锁还是redis做分布式锁,都要考虑两个重要问题:
如何确定当前对象正在使用。当一个节点的线程操作数据时在redis中创建键值对,setnx可以在插入时判断当前键值对是否存在,这就起到了加锁的作用。
如果一个线程获取到锁未能释放出现宕机怎么办。在redis可以设置键值对过期时间,当出现个线程获取到锁未能释放出现宕机情况时,过期时间到了自动释放。