Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan Kunci Teragih menggunakan Redis

Bagaimana untuk melaksanakan Kunci Teragih menggunakan Redis

PHPz
PHPzasal
2024-08-31 18:31:04745semak imbas

Saya Bodoh

Nah, setiap kali kami bekerja dalam sistem tempatan kami, semuanya berfungsi sebagai mentega. Itulah sebabnya kami memanggil "Tiada tempat yang lebih baik daripada 127.0.0.1" tetapi BANGUNLAH KENYATAAN

How to implement a Distributed Lock using Redis

Nah perkara tidak selalu berfungsi dalam pengeluaran seperti yang diharapkan. Selalunya apabila anda menjalankan berbilang kejadian aplikasi anda.

How to implement a Distributed Lock using Redis

? Seperti yang anda lihat bahawa jika berbilang contoh aplikasi kami sedang berjalan dan katakan pelanggan kami membuat permintaan untuk menandakan pengguna sebagai pengguna berbayar dalam DB kami.

  • Pelanggan akan meminta pelayan kami
  • Permintaan akan sampai di pengimbang beban kami
  • Dan salah satu contoh akan mendapat permintaan dan akan membuat pertanyaan tulis ke dalam DB kami

Nampaknya baik kan? Tiada masalah sehingga sekarang.

Nah, ya sampai sekarang tiada masalah. Tetapi bagaimana jika kita ingin menulis logik perniagaan seperti:-

  • ambil pengguna daripada DB
  • semak sama ada pengguna adalah pengguna percuma atau sudah berbayar
  • jika percuma, maka tandakan ia berbayar dan simpan dalam db
  • jika dibayar, hantar "Sudah dibayar" dalam jawapan.

⚡️ Seperti yang kita ketahui (andaikan kita menggunakan MySQL di sini) MySQL DB adalah mematuhi ACID yang bermaksud sebarang pertanyaan akan menjadi atom dan terpencil. yang bermaksud pertanyaan MySQL akan dijalankan dengan cara atom, sama ada ia akan lulus atau gagal. Tetapi ia tidak akan berhenti di antaranya.

? Tetapi ada satu isu di sini. Fikir, Fikir....

  • Langkah 1: Kami sedang mengambil pengguna (urus niaga Atom)
  • Langkah 2: Menjalankan beberapa logik perniagaan dalam kod
  • Langkah 3: Mengemas kini rekod MySQL jika pengguna tidak dibayar (urus niaga Atom)

Apakah yang akan berlaku jika pada Langkah 2, satu lagi permintaan datang untuk membatalkan pembayaran, dan kemudian pertanyaan itu dijalankan dahulu dan menandakan pengguna sebagai percuma, kemudian langkah 3 berjalan dan pengguna ditandai sebagai Berbayar.

?? Hore, Pengguna mendapat akses kepada Produk kami tanpa membayar.

Mengunci

✅ Inilah penyelamat, Kunci
How to implement a Distributed Lock using Redis

? Kunci ialah struktur yang membenarkan hanya satu utas pada satu masa untuk memasuki bahagian kritikal (blok kod yang tidak boleh diakses oleh berbilang pekerja iaitu benang)

Oleh itu, kami akan memperoleh kunci sebelum dan melepaskan selepas selesai operasi:-

  • Langkah 0: cuba dapatkan() kunci
  • Langkah 1: Jika diperoleh, Kami sedang mengambil pengguna (urus niaga Atom)
  • Langkah 2: Menjalankan beberapa logik perniagaan dalam kod
  • Langkah 3: Mengemas kini rekod MySQL jika pengguna tidak dibayar (urus niaga Atom)
  • Langkah 4: lepaskan() kunci

? Masalah

Sekarang, inilah masalahnya iaitu jika kami akan menggunakan beberapa dalam struktur data kunci memori atau sebarang kunci berasaskan memori ia akan layak untuk satu contoh untuk aplikasi kami. bagaimana pula dengan kejadian lain yang menjalankan kod yang sama dan mengemas kini dalam DB?

Nah di sini datang konsep penguncian Teragih

? Penguncian Teragih

How to implement a Distributed Lock using Redis

Di sini kunci bertindak sebagai perkhidmatan terpusat, di mana jika satu contoh perkhidmatan kami memperoleh kunci maka yang lain tidak boleh menggunakan kunci yang sama.

APAKAH KUNCI YANG BOLEH ADA DI SINI DALAM PERKHIDMATAN PEMBAYARAN?

? Untuk kunci pembayaran pengguna yang membuat pembayaran boleh menjadi gabungan = "PAYMENT_" + user_id + amount

Dan ini akan menjadi unik bagi setiap pengguna. Dan kunci ini akan kekal sama sekiranya pengguna membuat pembayaran atau membatalkan pembayaran. Oleh itu, apabila seseorang berlaku tindakan lain tidak dapat diteruskan kerana kedua-dua tindakan akan cuba memperoleh pada kunci yang sama.

? Apa sebenarnya Kunci, Dapatkan kunci, kunci lepaskan. Dan yang paling penting bagaimana redis sedang digunakan?


? Menggunakan Redis untuk melaksanakan Penguncian Teragih

Menggunakan satu contoh Redis:-

How to implement a Distributed Lock using Redis

Tetapi berikut adalah beberapa masalah dengan satu contoh redis:-

  • Satu kejadian mungkin gagal & kunci yang diperoleh mungkin tidak dikeluarkan
  • Jika dua kejadian digunakan (master-replica) apabila seorang pelanggan akan memperoleh kunci pada satu tika
  • master perlu berkomunikasi perkara yang sama dengan replika untuk disegerakkan. Komunikasi ini sendiri ialah komunikasi async

? Jadi, jika kunci diperoleh pada induk, dan semasa komunikasi ke replika jika induk turun sebelum menyegerak dengan replika. Replika akan menjadi induk di mana Kunci pada kunci yang sama akan tersedia untuk memperoleh yang diperoleh pada induk sebelum ini.

Dua contoh perkhidmatan kami akan dapat memperoleh kunci pada redis walaupun mempunyai dua kejadian (master-replica).

Menggunakan Algoritma Redlock:-

Memperoleh Kunci:- Kami akan cuba memperoleh kunci pada berbilang kejadian redis dengan masa tamat tempoh kunci
Pengesahan Kunci:- kunci akan dianggap sebagai diperoleh jika kejadian redis utama mendapat kunci diperoleh untuk pelanggan
Melepaskan Kunci:- Apabila melepaskan kunci, semua kejadian melepaskan kunci

How to implement a Distributed Lock using Redis

Dan ya itu sahaja.

❤️ Terima kasih kerana membaca, dan melanggan surat berita kami untuk lebih banyak artikel seperti itu:- https://www.servidedigest.com/

Untuk maklumat lanjut:-

  • Jedis di Jawa:- https://redis.io/docs/latest/develop/connect/clients/java/jedis/
  • Pelanggan Redis di Golang:- https://github.com/redis/go-redis

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan Kunci Teragih menggunakan Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn