1。原因在分布式环境下,多台机器上的多个进程对一个数据进行操作,必然会导致数据不一致,比如“商品超卖”。所以在分布式环境下,如何访问关键资源是互联网上的一大难题。分布式锁是一种解决方案。2、互斥原则:多个访问方对同一个资源进行操作需要进行互斥。通常使用一把这些访问方可以同时访问的锁来实现互斥。场景1同一个进程中,多个线程是互斥的,我们可以通过加锁来序列化访问。步骤:多个线程同时抢锁,只有一个线程抢到。没抢到就阻塞,不然抢锁的线程下次又来了。操作临界资源,操作临界资源后释放锁画外音:锁是进程中的一种数据结构,将临界资源的冲突转化为锁结构的冲突。场景2在分布式环境下,进程内的锁结构无法在进程外使用,那么在多进程的情况下如何保护关键资源呢?结合进程中的锁机制,我们可以得出一些条件:需要有一种特殊的数据结构,每个进程都可以同时访问,只有一个进程才能成功访问到临界资源。3、分布式锁既然分布式锁的核心是选择合适的外部存储,那么如何选择“合适”的存储介质和存储模型就是我们思考的核心。分布式锁是用关系存储还是KV存储?从锁的角度来说,我们要求不高,KV存储就足够了。这样一来,我们首先想到的就是Redis的方案。Redis方案是最好的方案吗?Redis:单线程高性能内存KV存储方案。所有进程都可以访问的数据结构是单线程的,只有一个进程可以访问成功(setnx命令)业务中保证set成功的进程执行关键资源操作步骤:多台机器上的多个进程竞争这个锁,比如同时对缓存进行setkey=123操作时,只有一个进程会抢到这个锁,即只有一个进程能成功对缓存设置key=123,不成功的进程会来给下次抢到锁的进程对临界资源进行操作,推完后释放锁,即deletekey=123forcache。从功能上来说,Redis完美的实现了分布式锁,再深入一点。MySQL可以实现分布式锁吗?ZooKeeper的分布式锁实现和Redis的实现有什么本质区别?我们应该如何选择不同的架构?
