Rumah  >  Artikel  >  pangkalan data  >  Cara Redis melaksanakan fungsi kunci teragih

Cara Redis melaksanakan fungsi kunci teragih

王林
王林asal
2023-11-07 15:28:55826semak imbas

Cara Redis melaksanakan fungsi kunci teragih

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.

  1. Kunci teragih dilaksanakan berdasarkan arahan SETNX

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()
  1. Kunci teragih berdasarkan arahan SET dan skrip Lua

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!

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