Rumah >pangkalan data >Redis >Prinsip dan pelaksanaan kunci teragih biasa dalam Redis (perkongsian ringkasan)

Prinsip dan pelaksanaan kunci teragih biasa dalam Redis (perkongsian ringkasan)

WBOY
WBOYke hadapan
2022-08-25 11:53:502444semak imbas

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:

Berdasarkan pangkalan data

Kunci pesimis

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.

Prinsip Pelaksanaan

Kawalan serentak pesimis sebenarnya merupakan strategi konservatif "dapatkan kunci dahulu dan kemudian akses", yang menyediakan jaminan untuk keselamatan pemprosesan data.

Pelaksanaan khusus

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;

//提交事务,自动释放悲观锁。

Optimis penguncian

Pengenalan

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.

Prinsip Pelaksanaan

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

  • 1 Perbandingan: membaca nilai A, sebelum mengemas kini kepada B, Periksa sama ada. nilai asal masih A (tidak diubah oleh urutan lain). Jika perubahan berlaku, jangan lakukan apa-apa.
  • Pelaksanaan khusus
Sebagai contoh, pseudokod untuk penguncian optimistik untuk melaksanakan potongan inventori adalah seperti berikut:

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};

Spring Boot melaksanakan prinsip kunci yang diedarkan Redis

<. .>Proses penguncian

Apabila klien 1 meminta, klien Zookeeper akan mencipta nod Locks nod yang berterusan Jika klien 1 ingin mendapatkan kunci, ia akan mencipta nod sementara di bawah nod kunci/. node_000000, jika anda mencari semua nod anak tertib sementara di bawah Locks, apabila anda adalah nod terkecil, anda akan memperoleh kunci dengan jayanya.

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 kunci

Apabila 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

Zookpeer实现分布式锁实现库存扣减

 @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!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam