Bagaimana untuk melaksanakan kunci dan baris gilir yang diedarkan menggunakan PHP dan Redis

王林
Lepaskan: 2023-05-11 18:38:01
asal
1964 orang telah melayarinya

Dengan pembangunan aplikasi Internet yang berterusan, masalah akses sistem serentak telah menjadi semakin ketara Bagaimana untuk memastikan konsistensi data dan mengelakkan persaingan sumber telah menjadi keutamaan. Mekanisme kunci dan baris gilir yang diedarkan ialah penyelesaian klasik Dengan menggabungkan ciri berkuasa PHP dan Redis, kami boleh melaksanakan sistem kunci dan baris gilir yang teragih dan cekap.

1. Mengapakah kita memerlukan mekanisme kunci dan giliran yang diedarkan?

Dalam persekitaran pelayan tunggal, kami boleh memastikan ketepatan akses serentak melalui mekanisme seperti benang dan kunci fail. Walau bagaimanapun, dalam persekitaran yang diedarkan, apabila berbilang proses atau pelayan mengakses sumber yang sama pada masa yang sama, mekanisme kunci tradisional tidak dapat menjamin ketekalan data dan boleh membawa kepada kebuntuan, kekeliruan data dan masalah lain dengan mudah.

Pada masa ini, mekanisme kunci dan baris gilir yang diedarkan boleh membantu kami menyelesaikan masalah ini. Kunci yang diedarkan boleh disegerakkan antara berbilang proses atau pelayan untuk memastikan bahawa hanya satu proses atau pelayan boleh mengakses sumber terkunci pada masa yang sama dan mekanisme baris gilir boleh menghantar mesej daripada pengeluar kepada pengguna untuk memastikan bahawa tugasan dijamin secara berurutan, pelaksanaan tidak segerak.

2. Bagaimana cara menggunakan Redis untuk melaksanakan kunci yang diedarkan?

Redis ialah pangkalan data dalam memori dengan ciri-ciri membaca dan menulis berkelajuan tinggi, ketekunan dan sokongan untuk berbilang struktur data. Kaedah melaksanakan kunci teragih dalam Redis terutamanya dicapai dengan menggunakan arahan SET NX. Apabila proses atau pelayan ingin beroperasi pada sumber, ia mula-mula menggunakan arahan SET NX untuk cuba memperoleh kunci. Jika pemerolehan kunci berjaya, anda boleh mengendalikan sumber; jika pemerolehan kunci gagal, anda perlu cuba memperoleh kunci itu semula.

Berikut ialah langkah pelaksanaan khusus:

  1. Tentukan kelas RedisLock.
class RedisLock {
    private $redis;
    private $key;
    private $lock_timeout = 10; //秒

    public function __construct($key) {
        $this->redis = new Redis();
        $this->redis->connect('localhost', 6379); //连接redis
        $this->key = $key;
    }

    public function __destruct() {
        $this->redis->close(); //关闭redis连接
    }

    public function lock() {
        $result = $this->redis->set($this->key, 1, ['NX', 'EX' => $this->lock_timeout]);
        return $result;
    }

    public function unlock() {
        $this->redis->del($this->key);
    }

}
Salin selepas log masuk
  1. Segera kelas RedisLock dan gunakan kaedah lock() untuk memperoleh kunci.
$lock = new RedisLock('test_lock');
if ($lock->lock()) {
    //成功获取锁
    //对资源进行操作
    $lock->unlock();
} else {
    //获取锁失败
}
Salin selepas log masuk

3. Bagaimanakah cara menggunakan Redis untuk melaksanakan baris gilir teragih?

Redis menyediakan struktur data Senarai untuk menyokong operasi baris gilir. Secara khusus, kita boleh menggunakan arahan LPUSH untuk menambah mesej pada kepala baris gilir dan arahan RPOP untuk mengalih keluar mesej daripada ekor baris gilir. Dengan cara ini, kami boleh menyampaikan mesej daripada pengeluar kepada pengguna dan mencapai pelaksanaan tugasan tidak segerak.

Berikut ialah langkah pelaksanaan khusus:

  1. Tentukan kelas RedisQueue.
class RedisQueue {
    private $redis;
    private $key;

    public function __construct($key) {
        $this->redis = new Redis();
        $this->redis->connect('localhost', 6379); //连接Redis
        $this->key = $key;
    }

    public function __destruct() {
        $this->redis->close(); //关闭Redis连接
    }

    public function push($value) {
        $this->redis->lPush($this->key, $value);
    }

    public function pop() {
        $value = $this->redis->rPop($this->key);
        if (!$value) {
            //队列为空
            return false;
        }
        return $value;
    }

}
Salin selepas log masuk
  1. Segera kelas RedisQueue dan gunakan kaedah push() untuk menambah mesej pada baris gilir.
$queue = new RedisQueue('test_queue');
$queue->push('task1');
$queue->push('task2');
Salin selepas log masuk
  1. Gunakan kaedah pop() di sebelah pengguna untuk mendapatkan mesej daripada baris gilir dan memproses tugasan.
$value = $queue->pop();
if ($value) {
    //处理任务$value
} else {
    //队列为空
}
Salin selepas log masuk

4. Nota

  1. Mekanisme kunci dan baris gilir yang diedarkan boleh membantu kami memastikan ketekalan data dan pelaksanaan tugas yang teratur dalam persekitaran yang diedarkan, tetapi Anda juga perlu memberi perhatian untuk mengelakkan kebuntuan, kebocoran sumber dan masalah lain.
  2. Untuk kunci yang diedarkan, tamat masa kunci perlu ditetapkan dengan sewajarnya.
  3. Untuk baris gilir yang diedarkan, kawalan aliran yang betul dan pemantauan tugas diperlukan untuk mengelakkan penggunaan sumber yang berlebihan.

Ringkasnya, PHP dan Redis menyediakan mekanisme kunci dan baris gilir teragih yang berkuasa yang boleh membantu kami membina aplikasi teragih berkonkurensi tinggi dan berprestasi tinggi dengan cepat. Dalam aplikasi praktikal, kita perlu memilih strategi kunci yang sesuai dan mekanisme baris gilir berdasarkan senario perniagaan yang berbeza, dan memantau dan mengoptimumkan konsistensi data sistem dan kecekapan pelaksanaan tugas secara menyeluruh.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan kunci dan baris gilir yang diedarkan menggunakan PHP dan Redis. 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