cari

Rumah  >  Soal Jawab  >  teks badan

php - Bagaimana untuk menggunakan Redis untuk menyelesaikan masalah penyisipan data berulang ke dalam MySQL yang disebabkan oleh konkurensi?

Senario perniagaan

Terdapat sistem pertanyaan Apabila pengguna membuat pertanyaan, jika tiada data dalam pangkalan data, dia perlu memanggil antara muka pertanyaan pihak ketiga untuk mendapatkan data, kemudian memasukkan data ke dalam pangkalan data, dan kemudian mendapatkan semula. data daripada pangkalan data dan mengembalikannya kepada pengguna. [Sistem ini dibangunkan berdasarkan PHP]

Perihalan masalah

Jika berbilang pengguna membuat pertanyaan, akan terdapat berbilang permintaan kepada antara muka pihak ketiga untuk pertanyaan pada masa yang sama dan masalah memasukkan data berulang akan timbul.

Bagaimana untuk menyelesaikan masalah ini?
Apabila memanggil antara muka pihak ketiga, gunakan Redis untuk memastikan hanya satu permintaan pergi ke pihak ketiga, dengan itu mengelakkan pertanyaan berulang dan memasukkan data kaedah? Bagaimana untuk mencapainya secara khusus?
Terima kasih!

淡淡烟草味淡淡烟草味2827 hari yang lalu757

membalas semua(4)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:03:48

    Mekanisme kunci. Sebelum kod memasuki operasi, semak sama ada operasi dikunci Jika ia dikunci, ganggu operasi. Jika tidak, teruskan ke operasi seterusnya Langkah pertama ialah mengunci operasi, kemudian jalankan kod Selepas melaksanakan kod, jangan lupa untuk membuka kunci operasi. Jika tidak, anda tidak akan dapat melaksanakan pelaksanaan.

    Terdapat banyak kod penguncian, dan yang diberikan di atas adalah salah satu daripadanya. Fail Redismemcachecache boleh digunakan Jika konkurensi operasi agak tinggi, adalah disyorkan untuk menggunakan redis seperti di atas. (Malah, ia adalah untuk menggunakan jenis data rentetan untuk memberikan nilai kepada kunci kunci {kunci}, dan apabila membuka kunci, nilai kunci akan dikosongkan atau diberikan nilai 0)

    $lock_status = $redis->get('lock_state');
    if ($lock_status == 0 || empty($lock_status)) {
        $redis->set('lock_state', 3600, 1); #操作上锁
        #操作代码
        $redis->set('lock_state', 3600, 0); #操作解锁
    } else {
        #上锁后的操作
    }

    balas
    0
  • 为情所困

    为情所困2017-05-16 13:03:48

    //定义锁的时间秒数
    $lockSecond = 5;
    
    //获取锁定状态
    $lockKey="xxx";
    $lockStatus = $redis->get($lockKey);
    
    if ($lockStatus == 0 || empty($lockStatus)) {//无锁
        //1.上锁
        $redis->set($lockKey, 1, ['nx', 'ex' => $lockSecond]); 
        //2.业务操作
        
        //3.解锁
        $redis->del($lockKey);
    } else {
        sleep($lockSecond);
         //恢复业务操作
       
    }

    balas
    0
  • 高洛峰

    高洛峰2017-05-16 13:03:48

    if (true == $redis_handle->set($lock_key, 1, array('nx', 'ex' => 6))) {
         //插入
    }

    balas
    0
  • 迷茫

    迷茫2017-05-16 13:03:48

    "Kunci" redis yang disebut oleh poster sudah tentu boleh dilaksanakan
    Selain itu, bolehkah ID unik ditetapkan untuk data yang ditanya Ini adalah pengesahan berganda

    balas
    0
  • Batalbalas