php - Bagaimana untuk menggunakan Redis untuk menyelesaikan masalah penyisipan data berulang ke dalam MySQL yang disebabkan oleh konkurensi?
淡淡烟草味
淡淡烟草味 2017-05-16 13:01:48
0
4
710

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!

淡淡烟草味
淡淡烟草味

membalas semua(4)
伊谢尔伦

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 {
    #上锁后的操作
}
为情所困
//定义锁的时间秒数
$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);
     //恢复业务操作
   
}
小葫芦
if (true == $redis_handle->set($lock_key, 1, array('nx', 'ex' => 6))) {
     //插入
}
迷茫

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan