Pembelajaran yang disyorkan: Tutorial video Redis
Kunci dalam Java terutamanya termasuk kunci dan kunci yang disegerakkan dalam pakej JUC Kunci ini adalah semua untuk kunci pada satu contoh JVM dan tidak sah untuk persekitaran yang diedarkan. Jadi bagaimana untuk melaksanakan kunci yang diedarkan?
Pelaksanaan kunci teragih biasa adalah seperti berikut:
Kunci Pesimistik (Kunci Pesimistik), seperti namanya, adalah kunci yang sangat pesimis Ia akan dikunci setiap kali apabila data diambil. Dengan cara ini, orang lain yang ingin mendapatkan data akan disekat sehingga kunci pesimis dilepaskan Sumber yang dikongsi dalam kunci pesimis hanya digunakan oleh satu utas pada satu masa, dan utas lain disekat dipindahkan ke benang lain Walau bagaimanapun, dari segi kecekapan, pemprosesan Mekanisme penguncian menjana overhed tambahan dan terdedah kepada kebuntuan.
Kawalan serentak pesimis sebenarnya merupakan strategi konservatif "dapatkan kunci dahulu dan kemudian akses", yang menyediakan jaminan untuk keselamatan pemprosesan data.
Sebagai contoh, kod pseudo untuk melaksanakan potongan inventori melalui penguncian pesimis adalah seperti berikut:
// 对于库存记录进行行锁 SELECT *FROM sys_goods s WHERE s.Id='1' FOR UPDATE; //执行库存扣减 update sys_stock s set s.stockQty=s.stockQty-#{number} where s.goodId=1 and s.stockQty>0; //提交事务,自动释放悲观锁。
Penguncian optimistik dilaksanakan berdasarkan mekanisme nombor versi data (versi). Tambahkan medan "versi" pada jadual pangkalan data, nombor versi ini dibacakan Semasa proses kemas kini, nombor versi akan dibandingkan, operasi akan berjaya dilaksanakan ditambah 1. Jika nombor versi tidak konsisten, kemas kini akan gagal.
Berbanding dengan penguncian pesimis, pelaksanaan penguncian optimistik tidak menggunakan mekanisme penguncian pangkalan data Prinsip penguncian optimistik dilaksanakan menggunakan mekanisme CAS, CAS (Banding-. dan- Tukar) bermaksud membandingkan dan menggantikan
Redis melaksanakan penguncian yang diedarkan
Mengenai pelaksanaan kunci yang diedarkan Redis, ia telah dijelaskan dalam artikel sebelumnya Anda boleh merujuk artikel berikut// 查询库存记录,获取版本号 SELECT stockQty,version FROM sys_goods s WHERE s.Id='1' //执行库存扣减,防止出现超卖 update sys_stock s set s.stockQty=s.stockQty-#{number}, s.version=version+1 where s.goodId=1 and s.stockQty>0 and version=#{version};
Apabila klien 2 cuba mendapatkan kunci, ia juga akan menyemak nod sementara di bawah kunci untuk menentukan sama ada nod/nod_000001 sendiri adalah yang terkecil terkecil, ia akan gagal memperoleh kunci , klien 2 akan mendaftarkan acara jam tangan dengan node_000000 nod kedudukan teratasnya untuk memantau sama ada node_000000 wujud Walaupun rampasan kunci gagal, node_000001 memasuki keadaan menunggu.
Proses melepaskan kunciApabila perniagaan pelanggan Zookeeper selesai atau pelanggan gagal, nod sementara akan dipadamkan dan kunci akan dilepaskan . Jika tugasan selesai, klien 1 juga akan secara jelas memanggil arahan untuk memadam node_000000.
Sebagai contoh, dalam rajah di atas, klien 1 diputuskan dan nod sementara node_000000 telah dipadamkan Pada masa ini, node_000001 mendapati dirinya sebagai nod sementara terkecil melalui pemerhati pemantauan, jadi Lock berjaya.
客户端1创建临时节点后,会与Zookeeper服务器维护一个Session,这个Session会依赖客户端 定时心跳来维持连接。由于网路异常原因,Zookeeper长时间收不到客户端1的心跳,就认为这个Session过期了,也会把这个临时节点删除,此时客户端2创建临时节点能够获取锁成功。当客户端网络恢复正常后,它仍然认为持有锁,此时就会造成锁冲突。
Zookeeper实现分布式锁,可以采用Curator实现分布式锁,关于SpringBoot如何集成Curator,大家可以参考如下文章:
Java Spring Boot 集成Zookeeper
@RequestMapping("/lockStock") public void lockStock() { zooKeeperUtil.lock("/Locks", 1000, TimeUnit.SECONDS, ()->{ //业务逻辑 }); }
小结:
关于分布式锁的实现的对比,详情请查看下图:
推荐学习:Redis视频教程
Atas ialah kandungan terperinci Prinsip dan pelaksanaan kunci teragih biasa dalam Redis (perkongsian ringkasan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!