Menggunakan Redis untuk melaksanakan kunci teragih dalam PHP

WBOY
Lepaskan: 2023-05-15 15:54:01
asal
2514 orang telah melayarinya

Dengan perkembangan pesat Internet dan peningkatan mendadak dalam lawatan tapak web, kepentingan sistem yang diedarkan secara beransur-ansur menjadi ketara. Dalam sistem yang diedarkan, isu penyegerakan konkurensi dan konsistensi data tidak dapat dielakkan terlibat. Kunci teragih, sebagai satu cara untuk menyelesaikan masalah penyegerakan serentak, secara beransur-ansur telah digunakan secara meluas dalam sistem teragih. Dalam PHP, Redis boleh digunakan untuk melaksanakan kunci teragih, yang akan diperkenalkan oleh artikel ini.

Apakah kunci teragih?

Dalam sistem yang diedarkan, apabila berbilang mesin memproses tugas yang sama bersama-sama, untuk mengelakkan berbilang mesin beroperasi pada sumber yang sama pada masa yang sama, sumber tersebut perlu dikunci. Kunci teragih ialah mekanisme untuk mengunci sumber yang dikongsi dalam sistem teragih. Kunci yang diedarkan perlu memastikan dua keperluan berikut:

1 Eksklusiviti bersama: Hanya seorang pelanggan boleh memegang kunci pada bila-bila masa.

2. Kemasukan Semula: Pelanggan yang sama boleh memperoleh kunci beberapa kali.

Terdapat banyak cara untuk melaksanakan kunci teragih, seperti menggunakan pangkalan data, menggunakan zookeeper, dsb. Artikel ini akan memperkenalkan kaedah menggunakan Redis untuk melaksanakan kunci teragih.

Prinsip Redis melaksanakan kunci teragih

Redis ialah sistem storan nilai kunci berprestasi tinggi yang menyokong pelbagai struktur data. Dalam Redis, arahan SET boleh digunakan untuk melaksanakan kunci yang diedarkan Prinsip pelaksanaannya adalah seperti berikut:

1.

2. Pelayan Redis memproses arahan SETNX yang diterima untuk menentukan sama ada kunci yang ditentukan wujud Jika ia tidak wujud, tetapkan nilai kunci kepada ID klien dan tetapkan masa tamat tempoh. Sekiranya wujud, kegagalan akan dikembalikan secara langsung.

3. Pelanggan menerima keputusan yang dikembalikan oleh Redis dan menentukan sama ada ia telah berjaya memperoleh kunci Jika berjaya, ia akan melakukan operasi yang sepadan, ia akan menunggu untuk tempoh masa hantar permintaan lagi.

Langkah untuk melaksanakan kunci teragih menggunakan Redis

1 Connect to Redis

Dalam PHP, menyambung ke Redis menggunakan sambungan PHPRedis, yang perlu dipasang sebelum ia boleh disambungkan. digunakan. Untuk kaedah pemasangan khusus, sila rujuk dokumentasi rasmi.

2. Dapatkan kunci

Laksanakan fungsi untuk memperoleh kunci seperti berikut:

protected function lock($lock_key, $expire_time = 5)
{
    $redis = new Redis();
    $redis->connect('localhost', 6379); // 连接Redis
    $micro_second = 1000000;
    $timeout = 10 * $micro_second; //等待锁超时时间

    while($timeout >= 0)
    {
        $microtime = microtime(true);
        $timeout -= $micro_second;
        $current_lock_time = $microtime + $expire_time + 1; //锁过期时间

        if($redis->setnx($lock_key, $current_lock_time)) //获取锁成功
        {
            $redis->expire($lock_key, $expire_time); //设置过期时间,防止死锁
            return $current_lock_time;
        }

        //检查锁是否过期
        $lock_time = $redis->get($lock_key);
        if($lock_time < $microtime)
        {
            $new_lock_time = $microtime + $expire_time + 1; //设置新的过期时间
            $old_lock_time = $redis->getset($lock_key, $new_lock_time); //获取旧的过期时间并设置新的过期时间
            if($old_lock_time < $microtime) //锁已经过期,获取锁成功
            {
                $redis->expire($lock_key, $expire_time); //设置过期时间,防止死锁
                return $new_lock_time;
            }
        }

        //等待一段时间后再次尝试获取锁
        usleep(10000); //等待10毫秒
    }

    return false;
}
Salin selepas log masuk

Fungsi fungsi ini adalah untuk memperoleh kunci kunci yang ditentukan pemerolehan berjaya, ia mengembalikan kunci Masa tamat; jika pemerolehan gagal, kembali palsu.

3. Lepaskan kunci

Sama ada disebabkan oleh kejayaan menyelesaikan operasi selepas memperoleh kunci, atau kegagalan memperoleh kunci selepas menunggu tempoh masa, kunci perlu dilepaskan. Laksanakan fungsi untuk melepaskan kunci seperti berikut:

protected function unlock($lock_key, $current_lock_time)
{
    $redis = new Redis();
    $redis->connect('localhost', 6379); // 连接Redis
    
    $lock_time = $redis->get($lock_key);
    if($lock_time == $current_lock_time) //判断是否为当前持有锁的客户端
        $redis->del($lock_key); //释放锁
}
Salin selepas log masuk

Fungsi fungsi ini adalah untuk melepaskan kunci kunci yang ditentukan Hanya klien yang sedang memegang kunci boleh melepaskan kunci.

Nota

1. Masa tamat tempoh kunci hendaklah ditetapkan secara munasabah mengikut situasi sebenar. Jika masa tamat tempoh kunci terlalu singkat, kunci mungkin tamat tempoh atau kunci tidak boleh didapati dengan kerap; jika masa tamat tempoh kunci terlalu lama, masa tamat tempoh kunci mungkin terlalu lama, menjejaskan prestasi sistem.

2. Apabila menetapkan masa tamat tempoh, pastikan untuk mengelakkan kebuntuan. Jika seorang pelanggan memperoleh kunci, tetapi kunci tidak dilepaskan kerana keluar atau ranap yang tidak dijangka, ia akan menjejaskan pelanggan lain untuk memperoleh kunci itu, menyebabkan masalah kebuntuan.

3 Memandangkan pelaksanaan kunci yang diedarkan bergantung pada pengecam unik pelanggan, pelanggan yang berbeza perlu menggunakan pengecam yang berbeza, jika tidak, satu pelanggan boleh melepaskan kunci pelanggan lain. Dalam PHP, anda boleh menggunakan PHP_SESSION_ID atau alamat IP/ID proses sebagai pengecam unik klien.

Kesimpulan

Menggunakan Redis untuk melaksanakan kunci teragih ialah penyelesaian kunci teragih yang agak mudah dan praktikal dalam PHP. Dalam aplikasi praktikal, adalah perlu untuk menetapkan masa tamat tempoh kunci secara munasabah mengikut situasi sebenar untuk mengelakkan masalah kebuntuan dan memastikan kestabilan dan kebolehpercayaan sistem. Pada masa yang sama, perhatian perlu diberikan untuk memastikan keunikan pengecam unik pelanggan untuk mengelakkan masalah yang mungkin berlaku.

Atas ialah kandungan terperinci Menggunakan Redis untuk melaksanakan kunci teragih dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!