Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Redis pengendalian kunci pesimis dalam aplikasi PHP

Redis pengendalian kunci pesimis dalam aplikasi PHP

WBOY
WBOYasal
2023-05-15 14:31:581515semak imbas

Redis ialah pangkalan data dalam memori berprestasi tinggi yang digunakan secara meluas dalam pelbagai aplikasi web. Prestasi unggul dan sokongan untuk pelbagai jenis data menjadikan Redis pangkalan data pilihan untuk banyak aplikasi PHP. Dalam aplikasi PHP, kita selalunya perlu mengawal akses serentak berbilang proses atau utas kepada sumber yang dikongsi. Sumber yang dikongsi termasuk cache, log, konfigurasi, dll. Bilangan proses atau utas yang perlu diakses pada masa yang sama mungkin besar, jadi mekanisme kawalan akses serentak dan kunci diperkenalkan untuk mengurusnya. Artikel ini akan memperkenalkan pengendalian kunci pesimis Redis dalam aplikasi PHP.

Kunci pesimis ialah kaedah kunci yang paling biasa digunakan Perlaksanaannya adalah untuk menganggap bahawa berbilang proses atau utas ingin membaca atau menulis sumber pada masa yang sama akan menganggap bahawa hanya satu proses boleh melaksanakan operasi Proses lain perlu menunggu. Penguncian pesimis boleh mengelakkan masalah ketidakkonsistenan yang disebabkan oleh berbilang proses serentak atau utas yang mengakses sumber yang sama pada masa yang sama.

Dalam aplikasi PHP, kami boleh melaksanakan mekanisme penguncian pesimis melalui Redis. Redis menyediakan mekanisme untuk melaksanakan kunci berdasarkan perintah SETNX dan EXPIRE. Arahan SETNX boleh menetapkan kunci dan nilai dalam Redis Ia hanya boleh ditetapkan dengan jayanya jika kunci itu tidak wujud. Perintah EXPIRE boleh menetapkan masa tamat tempoh untuk kunci. Melalui gabungan SETNX dan EXPIRE, kami boleh melaksanakan mekanisme kunci.

Berikut ialah demonstrasi pelaksanaan kunci pesimis Redis melalui kod PHP:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'lock_key';
$timeout = 10; //设置超时时间为10秒
while(true){
    $lock = $redis->setnx($key, time() + $timeout);
    if($lock){ //如果成功设置了键值,表示锁可用
        break;
    }
    $expire = $redis->get($key);
    //判断当前时间是否已经超过超时时间
    if($expire < time()){
        //锁已过期,删除该键值重新获取锁
        $redis->del($key);
        continue;
    }
    //锁未过期,等待一段时间后尝试获取锁
    sleep(1);
}
//成功获取锁后,执行需要锁保护的代码
//执行结束后,删除该键值释放锁
$redis->del($key);

Dalam kod di atas, kami menggunakan gelung sementara (benar) untuk mendapatkan kunci. Mula-mula cuba tetapkan kunci dan nilai dalam Redis menggunakan arahan SETNX, dan tetapkan masa tamat tempoh kunci ini kepada masa semasa ditambah tamat masa tamat. Jika kunci berjaya ditetapkan, anda boleh memasukkan kod yang perlu dilindungi. Jika kunci sudah diduduki oleh proses atau benang lain, kunci tidak boleh diperolehi dan kunci akan dicuba semula selepas menunggu untuk tempoh masa. Jika kunci telah tamat tempoh, padamkan nilai kunci dan dapatkan semula kunci itu.

Secara amnya, mekanisme penguncian pesimis Redis agak mudah, tetapi logik tamat masa kunci dan cuba semula perlu dikendalikan dengan teliti. Pada masa yang sama, untuk mengelakkan masalah kebuntuan, kita juga perlu memberi perhatian kepada pelepasan kunci. Dalam penggunaan sebenar, kami boleh memudahkan penggunaan kunci pesimis dengan merangkum fungsi PHP atau menggunakan perpustakaan pihak ketiga.

Dalam menghadapi senario konkurensi yang tinggi, penguncian pesimis ialah mekanisme penguncian yang lebih berkesan. Menggunakan mekanisme penguncian pesimis Redis dalam aplikasi PHP boleh meningkatkan prestasi konkurensi sistem sambil memastikan ketekalan data.

Atas ialah kandungan terperinci Redis pengendalian kunci pesimis dalam aplikasi PHP. 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