Rumah  >  Artikel  >  pangkalan data  >  Bagaimanakah redis menyelesaikan masalah konkurensi inventori dan mencapai kawalan kuantiti?

Bagaimanakah redis menyelesaikan masalah konkurensi inventori dan mencapai kawalan kuantiti?

PHPz
PHPzke hadapan
2023-05-29 09:52:20917semak imbas

Redis ialah satu proses dan jenis penyekatan Ia hanya boleh memproses satu permintaan pada masa yang sama, dan permintaan seterusnya perlu dibariskan dan menunggu.

Kelebihan: Kerana ia adalah satu proses, tidak perlu menangani isu konkurensi, mengurangkan kerumitan sistem

Kelemahan: Tidak sesuai untuk menyimpan objek bersaiz besar (lebih daripada 100kb)

Sebab: Disebabkan Redis hanya menggunakan satu teras, manakala Memcached boleh menggunakan berbilang teras, jadi secara purata, Redis mempunyai prestasi yang lebih tinggi daripada Memcached apabila menyimpan data kecil pada setiap teras.

Untuk data lebih daripada 100k, prestasi Memcached lebih tinggi daripada Redis Walaupun Redis juga telah dioptimumkan untuk prestasi menyimpan data besar, ia masih lebih rendah sedikit daripada Memcached.

Memcache adalah berbilang proses dan tidak menyekat Jika ia hanya digunakan sebagai cache, memcache adalah lebih sesuai

Bagaimanakah redis menyelesaikan masalah konkurensi inventori dan mencapai kawalan kuantiti?

Arahan

wujud Semak sama ada kunci sudah wujud dalam redis, contohnya wujud mycounter

set Set mulakan nilai kunci seperti set mycounter 99

get Dapatkan nilai kunci seperti getmycounter

incr meningkat sebanyak 1, contohnya incrmycounter //Hasil keluaran ialah 100

incrby menentukan nilai peningkatan, contohnya incrbymycounter 2 //Hasil keluaran ialah 102

menentukan turunkan nilai, contohnya incrbymycounter -2 //Hasil keluaran ialah 100

setnx Apabila nilai tidak wujud, tetapkan nilai dengan jayanya Contohnya, setnxmycounter 99 //Hasil keluaran ialah 0, yang bermaksud tetapan gagal. Ia sudah wujud dalam redis

setnx key1 12 //Hasil output ialah 1. , menunjukkan bahawa tetapan itu berjaya dan tidak wujud dalam redis sebelum

tamat tempoh Tetapkan hayat. kitaran kunci, sebagai contoh, tamat tempoh mycounter 30 //Tetapkan kepada tempoh sah 30 saat

ttl Dapatkan masa tamat tempoh kunci, contohnya, ttlmycounter //Output Ia adalah 13, bermakna tinggal 13 saat lagi . Jika ia kembali -1, ia bermakna ia tidak akan tamat tempoh dan akan sentiasa wujud dalam cache redis, melainkan terdapat memori yang tidak mencukupi

//Jika ia kembali -2, ia bermakna ia telah tamat tempoh dan redis tidak mempunyai seperti Nilai utama boleh disahkan dengan wujud, dan 0 dikembalikan, bermakna ia tidak wujud

2. Senario biasa

Disebabkan tergesa-gesa untuk membeli produk, kuantiti tidak boleh dikawal, menyebabkan inventori melebihi had, mengakibatkan kos tidak mencukupi. (Contohnya: Inventori ialah 1,000, tetapi pengguna berjaya membeli 2,000 item, dan inventori tidak mencukupi.)

Had loteri adalah terhad, saya tidak mengawalnya dan saya menghabiskan terlalu banyak wang

Merebut sampul merah

3. Carta alir dan kod

Carta alir Pilihan 1:

Bagaimanakah redis menyelesaikan masalah konkurensi inventori dan mencapai kawalan kuantiti?

Carta alir Pilihan 2 :

Bagaimanakah redis menyelesaikan masalah konkurensi inventori dan mencapai kawalan kuantiti?

//方案1代码,测试坏境TP5
public function redisCountV1(){
    Log::record("测试版本1并发开始", Log::INFO);
    $redis = new Redis();
    //总库存数量
    $amountLimit = 100;
    //redis存储库存键名
    $keyName = "mycounter_v6";
    //假设每次消耗库存数为1
    $incrAmount = 1;
    //判断redis中是否 存在该值,如果不存在,则用set设置(问题是如果出现并发,两个或多个用户同时访问,会导致库存重新设置)
    if(!$redis->exists($keyName)){
        $redis->set($keyName, 95);
    }
    //从redis中取出当前库存数
    $currAmount = $redis->get($keyName);
    //如果当前库存数+增长的库存数>总库存,直接返回
    if($currAmount + $incrAmount > $amountLimit) {
        file_put_contents("/Users/han/Documents/www/cs/testv1.log", "bad luck \n", FILE_APPEND);
        Log::record("bad luck", Log::INFO);
        return false;
    }
    //缓存库存数量增加
    $redis->incrby($keyName, $incrAmount);
    file_put_contents("/Users/han/Documents/www/cs/testv1.log", "good luck \n", FILE_APPEND);
    Log::record("good luck", Log::INFO);
}

//测试方式:ab  -c 100 -n 200 http://www.fenleduo.com:8080/V7/Test/redisCountV1
//方案2代码,测试坏境TP5
public function redisCountV2(){
    Log::record("测试版本2并发开始", Log::INFO);
    $redis = new Redis();
    //总库存数量
    $amountLimit = 100;
    //redis存储库存键名
    $keyName = "mycounter_v12";
    //假设每次消耗库存数为1
    $incrAmount = 1;
    //判断redis中是否 存在该值,如果不存在,则用setnx设置(注:如果出现并发,两个或多个用户同时访问,不会导致库存重新设置)
    if(!$redis->exists($keyName)){
        //setnx 如果不存在该值,则设置,如果存在则不会设置
        $redis->setnx($keyName, 95);
    }
    //从redis中取出当前库存数
    $currAmount = $redis->get($keyName);
    //如果当前库存数+增长的库存数>总库存,直接返回
    if($redis->incrby($keyName, $incrAmount) > $amountLimit) {
        file_put_contents("/Users/han/Documents/www/cs/testv2.log", "bad luck \n",FILE_APPEND);
        Log::record("bad luck", Log::INFO);
        return false;
    }
    file_put_contents("/Users/han/Documents/www/cs/testv2.log", "good luck \n",FILE_APPEND);
    Log::record("good luck", Log::INFO);
}
//测试方式:ab  -c 100 -n 200 http://www.fenleduo.com:8080/V7/Test/redisCountV2

Atas ialah kandungan terperinci Bagaimanakah redis menyelesaikan masalah konkurensi inventori dan mencapai kawalan kuantiti?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam