Rumah >pangkalan data >Redis >Perbandingan ZooKeeper pelaksanaan Redis bagi kunci yang diedarkan
Dengan perkembangan pesat teknologi Internet, sistem yang diedarkan telah digunakan secara meluas dalam aplikasi moden, terutamanya dalam syarikat Internet yang besar. Walau bagaimanapun, dalam sistem teragih, sangat sukar untuk mengekalkan konsistensi antara nod, jadi mekanisme kunci teragih telah menjadi salah satu asas untuk menyelesaikan masalah ini. Dalam pelaksanaan kunci yang diedarkan, Redis dan ZooKeeper adalah kedua-dua alat yang popular.
Redis ialah sistem storan data dalam memori sumber terbuka yang boleh digunakan sebagai pangkalan data, cache dan perisian tengah mesej. Mekanisme kunci teragih Redis dilaksanakan melalui SETNX Perintah SETNX boleh menetapkan nilai kunci secara atom, tetapi ia hanya berjaya ditetapkan apabila kunci tidak wujud. Oleh itu kita boleh melaksanakan kunci teragih melalui SETNX.
Andaikan kita ingin melaksanakan kunci bernama Lock dan perlu mengunci pembolehubah kongsi Anda boleh menggunakan kod contoh berikut:
def acquire_lock(conn, lockname, acquire_timeout=10): identifier = str(uuid.uuid4()) end = time.time() + acquire_timeout while time.time() < end: if conn.setnx(lockname, identifier): return identifier time.sleep(0.001) return False
Dalam kod di atas, fungsi acquire_lock menjana nilai rawak. melalui uuid Pengecam, dan beroperasi pada nama kunci melalui setnx, dan mengembalikan pengecam jika operasi berjaya. Mengembalikan Palsu jika kunci tidak diperoleh.
Tetapi terdapat masalah di sini: jika pelanggan telah memperoleh kunci, tetapi ranap atau tergantung sebelum melepaskan kunci, maka pelanggan lain tidak akan dapat memperoleh kunci itu, yang menyebabkan masalah kebuntuan. Untuk mengelakkan ini, kami boleh menambah tamat masa untuk melepaskan kunci secara automatik. Berikut ialah kod untuk melepaskan kunci:
def release_lock(conn, lockname, identifier): pip = conn.pipeline(True) while True: try: # watch the lock name to ensure that no one else has acquired the lock pip.watch(lockname) if pip.get(lockname) == identifier: pip.multi() pip.delete(lockname) pip.execute() return True pip.unwatch() break except redis.exceptions.WatchError: pass return False
Kod contoh di atas agak mudah dan boleh digunakan terus. Walau bagaimanapun, dalam penggunaan sebenar, senario kunci yang diedarkan adalah lebih kompleks dan memerlukan penyelesaian yang lebih lengkap. Mari kita lihat cara ZooKeeper melaksanakan kunci teragih.
ZooKeeper ialah perkhidmatan penyelarasan teragih yang boleh digunakan untuk menyelaraskan status nod yang berbeza dalam sistem teragih pergi ke ZooKeeper untuk menyelaraskan pelbagai nod. Dalam ZooKeeper, kunci yang diedarkan juga merupakan mekanisme yang sangat berguna.
Proses asas melaksanakan kunci teragih dalam ZooKeeper adalah seperti berikut:
(1) Buat nod mutex (Mutex Node)
Pertama, pelanggan perlu mencipta mutex pada ZooKeeper Nod kunci digunakan sebagai pengecam kunci. Anda boleh menggunakan arahan cipta untuk mencipta nod Jika nod sudah wujud, penciptaan akan gagal. Apabila membuat nod, anda perlu menentukan jenis nod kunci yang diedarkan secara amnya menggunakan nod tertib jangka pendek, iaitu, menambahkan set nombor pada nama nod untuk memastikan keunikan nama nod.
(2) Mendapatkan kunci
Proses memperoleh kunci ialah proses mengunci nod kunci mutex. Urutan di mana kunci diperoleh ditentukan oleh susunan berangka dalam nama nod. Jika pelanggan berjaya mencipta nod mutex, maka ia memiliki kunci itu. Jika nod tidak berjaya dibuat, anda perlu menunggu pelanggan lain melepaskan kunci sebelum mencuba lagi.
(3) Lepaskan kunci
Apabila pelanggan tidak lagi perlu mengunci sumber, ia perlu melepaskan kunci. Melepaskan kunci memerlukan pemadaman nod kunci mutex Selepas kunci dilepaskan, pelanggan lain akan segera menerima mesej pelepasan kunci melalui mekanisme Pemerhati.
ZooKeeper lebih mahal daripada Redis. Ia memerlukan perkhidmatan permulaan dan memasang dan menyelenggara kelompok ZooKeeper Oleh itu, kekerapan menggunakan ZooKeeper untuk melaksanakan kunci teragih dalam sistem teragih adalah agak rendah. Walau bagaimanapun, ZooKeeper secara relatifnya lebih stabil dan selamat, dan lebih sesuai daripada Redis untuk beberapa sistem kritikal.
Secara amnya, Redis dan ZooKeeper adalah penyelesaian pelaksanaan kunci teragih yang sangat praktikal. Apabila memilih penyelesaian untuk digunakan, anda perlu membuat pilihan berdasarkan situasi sebenar dan membuat pertukaran dari segi prestasi, kestabilan, keselamatan, dll. untuk mencapai hasil yang terbaik.
Atas ialah kandungan terperinci Perbandingan ZooKeeper pelaksanaan Redis bagi kunci yang diedarkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!