Cara Redis melaksanakan fungsi kunci teragih
Kunci teragih ialah mekanisme penyegerakan yang biasa digunakan dalam sistem teragih. Ia boleh membantu kami mencapai pengecualian bersama antara pelbagai proses atau berbilang pelayan. Sebagai cache berprestasi tinggi dan perisian tengah baris gilir mesej, Redis juga menyediakan fungsi melaksanakan kunci teragih. Artikel ini akan memperkenalkan cara Redis melaksanakan kunci teragih dan memberikan contoh kod khusus.
Redis menyediakan arahan SETNX, yang boleh menetapkan nilai kunci apabila kunci tidak wujud Jika kunci sudah wujud, pelaksanaan arahan gagal. Kita boleh menggunakan arahan SETNX untuk melaksanakan fungsi kunci yang diedarkan.
Berikut ialah contoh kod untuk kunci teragih berdasarkan arahan SETNX:
import redis class RedisLock: def __init__(self, key, value, expire_time): self.redis = redis.Redis(host='localhost', port=6379, db=0) self.key = key self.value = value self.expire_time = expire_time def acquire(self): while True: result = self.redis.setnx(self.key, self.value) if result: self.redis.expire(self.key, self.expire_time) return True def release(self): self.redis.delete(self.key)
Dalam kod di atas, kami mentakrifkan kelas RedisLock, yang mempunyai dua kaedah: memperoleh dan melepaskan. Kaedah perolehan cuba memperoleh kunci teragih dan mengembalikan Benar jika pemerolehan berjaya melepaskan kunci teragih.
Anda boleh memanggilnya seperti ini apabila menggunakan:
lock = RedisLock('my_lock', '1', 10) if lock.acquire(): try: # 执行需要加锁的业务逻辑 ... finally: lock.release()
Pelaksanaan di atas berdasarkan arahan SETNX mungkin menghadapi masalah dalam beberapa kes, seperti apabila masa pelaksanaan logik perniagaan adalah sangat lama, ia boleh menyebabkan kegagalan kunci. Untuk menyelesaikan masalah ini, kita boleh menggunakan skrip Lua digabungkan dengan arahan SET untuk melaksanakan kunci teragih.
Berikut ialah contoh kod untuk kunci yang diedarkan berdasarkan arahan SET dan skrip Lua:
import redis class RedisLock: def __init__(self, key, value, expire_time): self.redis = redis.Redis(host='localhost', port=6379, db=0) self.key = key self.value = value self.expire_time = expire_time def acquire(self): script = ''' if redis.call("exists", KEYS[1]) == 0 then redis.call("set", KEYS[1], ARGV[1]) redis.call("expire", KEYS[1], tonumber(ARGV[2])) return 1 else return 0 end ''' result = self.redis.eval(script, 1, self.key, self.value, self.expire_time) return result == 1 def release(self): self.redis.delete(self.key)
Dalam kod di atas, kami menggunakan kaedah eval untuk memanggil skrip Lua Skrip menentukan sama ada untuk menetapkan nilai kunci dengan menilai sama ada kunci itu wujud dan masa tamat tempoh. Dengan cara ini, walaupun pelaksanaan logik perniagaan mengambil masa yang lama, tidak akan ada masalah kegagalan kunci.
Kaedah penggunaan adalah sama seperti pelaksanaan di atas berdasarkan arahan SETNX.
Ringkasan:
Artikel ini memperkenalkan cara Redis melaksanakan fungsi kunci yang diedarkan, dan menyediakan contoh kod berdasarkan arahan SETNX dan arahan SET dan skrip Lua. Dalam aplikasi praktikal, kita boleh memilih kaedah pelaksanaan yang sesuai untuk melaksanakan kunci teragih mengikut keperluan untuk memastikan akses yang saling eksklusif kepada sumber yang dikongsi.
Atas ialah kandungan terperinci Cara Redis melaksanakan fungsi kunci teragih. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!