cari
Rumahpangkalan dataRedisCara menggunakan PHP+Redis untuk menyelesaikan masalah penjualan berlebihan produk di bawah keselarasan tinggi

Untuk sesetengah tapak web e-dagang dengan bilangan pengguna tertentu, jika mereka hanya menggunakan pangkalan data hubungan (seperti MySQL, Oracle) untuk pembelian tergesa-gesa, tekanan pada pangkalan data akan menjadi sangat hebat, dan jika mekanisme kunci pangkalan data adalah tidak digunakan dengan betul, , ia juga akan membawa kepada masalah produk dan kupon terlebih jual. Syarikat saya juga menghadapi masalah yang sama Masalahnya berlaku apabila kupon terlalu dibeli Selepas masalah berlaku, kami mula memikirkan cara untuk menyelesaikan masalah ini. Oleh kerana saya banyak menggunakan redis . Gunakan ciri prestasi tinggi dan transaksi redis untuk menyelesaikan masalah kupon dalam talian yang diambil oleh stok berlebihan Di bawah saya memberikan versi pertama kod pseudo yang saya selesaikan sementara masalah ini, dengan beberapa butiran dialih keluar:

/**
 * 抢优惠券(秒杀)
 * @param int $couponId 商品ID
 * @param int $uid 用户ID
 * @return bool
 */
function secKill($couponId, $uid)
{
    //1.初始化Redis连接
    $redis = new Redis();
    if (!$redis->connect('127.0.0.1', 6379)) {
        trigger_error('Redis连接出错!!!', E_USER_ERROR);
    } else {
        echo &#39;连接正常<br>&#39;;
    }

    //秒杀商品的库存key
    $key = &#39;secKill:&#39;.$couponId.&#39;:stock&#39;;
    $redis->watch($key);

    //获取库存
    $stock = $redis->get($key);

    //秒杀未开始,表示库存为null
    if (!$stock && !is_numeric($stock)) {
        echo &#39;秒杀未开始&#39;;
        return false;
    }

    //判断库存,如果库存大于0,则减库存,将该成功秒杀用户加入哈希表,如果小于等于0,秒杀结束
    if ($stock <= 0) {
        echo &#39;秒杀已结束&#39;;
        return false;
    }

    //用户已经成功秒杀过一次了,不允许再次参与秒杀
    if ($redis->sIsMember(&#39;secKill:&#39;.$couponId.&#39;:uid&#39;, $uid)) {
        echo &#39;秒杀失败&#39;;
        return false;
    }

    //代码走到这里,说明该用户是第一次参与秒杀,将库存减一,然后把这个人放到已抢到的集合表
    $redisMulti = $redis->multi();
    $redisMulti->decr($key);
    $redisMulti->sAdd(&#39;secKill:&#39;.$couponId.&#39;:uid&#39;, $uid);
    $result = $redisMulti->exec();

    if (empty($result)) {//事务被取消
        echo &#39;秒杀失败&#39;;
        return false;
    }

    //抢券成功,将优惠券ID和UID放入到队列中,由一个单独的进程队列来消费队列里的数据,向用户推送抢到的优惠券
    $redis->lPush(&#39;couponOrder&#39;, $couponId.&#39;+&#39;.$uid);

    return true;
}

$couponId = 11211;
$uid      = mt_rand(1, 100);
secKill($couponId, $uid);

Mula-mula, saya mensimulasikan menetapkan inventori kupon dengan ID kupon 11211 hingga 10.

Cara menggunakan PHP+Redis untuk menyelesaikan masalah penjualan berlebihan produk di bawah keselarasan tinggi

Kemudian, kami menggunakan alat ab untuk mensimulasikan 1000 permintaan dan 50 konkurensi untuk menguji

ab -n 1000 -c 50 www.test.com/

Kemudian kami menggunakan Redis Desktop Manager untuk melihat beberapa Redis Result

Sudah ada 10 maklumat pengguna dalam baris gilir kuponOrder

Cara menggunakan PHP+Redis untuk menyelesaikan masalah penjualan berlebihan produk di bawah keselarasan tinggi

Dan baki bilangan kupon juga ialah 0, bukan lagi nombor negatif

Cara menggunakan PHP+Redis untuk menyelesaikan masalah penjualan berlebihan produk di bawah keselarasan tinggi

Pada masa yang sama, maklumat UID 10 pengguna juga disimpan dalam koleksi kupon pengguna.

Cara menggunakan PHP+Redis untuk menyelesaikan masalah penjualan berlebihan produk di bawah keselarasan tinggi

Rentetan kod di atas menyelesaikan dua masalah:

  • Ia menyelesaikan masalah sejumlah besar pertanyaan segera kepada pangkalan data menyebabkan banyak kerosakan pada pangkalan data. Masalah tekanan tinggi, trafik dipintas dalam lapisan cache redis

  • Menyelesaikan masalah kupon yang diambil oleh stok berlebihan

Walau bagaimanapun, Kod ini juga mempunyai masalah tertentu:

  1. Kolam sambungan redis tidak digunakan dan penciptaan redis baharu yang kerap mempunyai kesan prestasi tertentu

  2. Ia masih merupakan transaksi Masalah inventori yang terhasil ialah jika terdapat 10 produk dan 1,000 permintaan setiap satu mempunyai 200 permintaan serentak, 1,000 permintaan akan diselesaikan dengan 5 permintaan serentak, tetapi hanya 5 pengguna yang akan berjaya merebutnya tidak ada permintaan berikutnya, akan ada Akibatnya, masih terdapat 5 salinan dalam stok
  3. Petua: Dalam baris gilir penggunaan, jika kupon gagal dikeluarkan, pastikan anda merekodkan ia serta-merta dan maklumkan pengurus operasi melalui mesej teks untuk melihat sama ada ia boleh dikeluarkan semula atau Ditolak kepada pengguna melalui penyasaran manual di latar belakang.

Atas ialah kandungan terperinci Cara menggunakan PHP+Redis untuk menyelesaikan masalah penjualan berlebihan produk di bawah keselarasan tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:亿速云. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Redis: Mengenal pasti fungsi utamanyaRedis: Mengenal pasti fungsi utamanyaApr 12, 2025 am 12:01 AM

Fungsi teras Redis adalah sistem penyimpanan dan pemprosesan data berprestasi tinggi. 1) Akses data berkelajuan tinggi: Redis menyimpan data dalam memori dan menyediakan kelajuan membaca dan menulis tahap mikrosecond. 2) Struktur Data Kaya: Menyokong rentetan, senarai, koleksi, dan lain -lain, dan menyesuaikan diri dengan pelbagai senario aplikasi. 3) Kegigihan: Data berterusan ke cakera melalui RDB dan AOF. 4) Menerbitkan langganan: boleh digunakan dalam beratur mesej atau sistem komunikasi masa nyata.

Redis: Panduan untuk struktur data popularRedis: Panduan untuk struktur data popularApr 11, 2025 am 12:04 AM

Redis menyokong pelbagai struktur data, termasuk: 1. String, sesuai untuk menyimpan data nilai tunggal; 2. Senarai, sesuai untuk beratur dan susunan; 3. Tetapkan, digunakan untuk menyimpan data yang tidak duplikasi; 4. Diarahkan set, sesuai untuk senarai ranking dan beratur keutamaan; 5. Jadual hash, sesuai untuk menyimpan objek atau data berstruktur.

Cara Melaksanakan Kaunter RedisCara Melaksanakan Kaunter RedisApr 10, 2025 pm 10:21 PM

Kaunter Redis adalah satu mekanisme yang menggunakan penyimpanan pasangan nilai utama REDIS untuk melaksanakan operasi pengiraan, termasuk langkah-langkah berikut: mewujudkan kekunci kaunter, meningkatkan tuduhan, mengurangkan tuduhan, menetapkan semula, dan mendapatkan tuduhan. Kelebihan kaunter Redis termasuk kelajuan cepat, konkurensi tinggi, ketahanan dan kesederhanaan dan kemudahan penggunaan. Ia boleh digunakan dalam senario seperti pengiraan akses pengguna, penjejakan metrik masa nyata, skor permainan dan kedudukan, dan pengiraan pemprosesan pesanan.

Cara menggunakan baris arahan redisCara menggunakan baris arahan redisApr 10, 2025 pm 10:18 PM

Gunakan alat baris perintah redis (redis-cli) untuk mengurus dan mengendalikan redis melalui langkah-langkah berikut: Sambungkan ke pelayan, tentukan alamat dan port. Hantar arahan ke pelayan menggunakan nama arahan dan parameter. Gunakan arahan bantuan untuk melihat maklumat bantuan untuk arahan tertentu. Gunakan perintah berhenti untuk keluar dari alat baris arahan.

Cara Membina Mod Kluster RedisCara Membina Mod Kluster RedisApr 10, 2025 pm 10:15 PM

Mod Redis cluster menyebarkan contoh Redis ke pelbagai pelayan melalui sharding, meningkatkan skalabilitas dan ketersediaan. Langkah -langkah pembinaan adalah seperti berikut: Buat contoh Redis ganjil dengan pelabuhan yang berbeza; Buat 3 contoh sentinel, memantau contoh redis dan failover; Konfigurasi fail konfigurasi sentinel, tambahkan pemantauan maklumat contoh dan tetapan failover; Konfigurasi fail konfigurasi contoh Redis, aktifkan mod kluster dan tentukan laluan fail maklumat kluster; Buat fail nodes.conf, yang mengandungi maklumat setiap contoh Redis; Mulakan kluster, laksanakan perintah Buat untuk membuat kluster dan tentukan bilangan replika; Log masuk ke kluster untuk melaksanakan perintah maklumat kluster untuk mengesahkan status kluster; buat

Cara Membaca Gilir RedisCara Membaca Gilir RedisApr 10, 2025 pm 10:12 PM

Untuk membaca giliran dari Redis, anda perlu mendapatkan nama giliran, membaca unsur -unsur menggunakan arahan LPOP, dan memproses barisan kosong. Langkah-langkah khusus adalah seperti berikut: Dapatkan nama giliran: Namakannya dengan awalan "giliran:" seperti "giliran: my-queue". Gunakan arahan LPOP: Keluarkan elemen dari kepala barisan dan kembalikan nilainya, seperti LPOP Queue: My-Queue. Memproses Baris kosong: Jika barisan kosong, LPOP mengembalikan nihil, dan anda boleh menyemak sama ada barisan wujud sebelum membaca elemen.

Cara Menggunakan Redis Cluster ZsetCara Menggunakan Redis Cluster ZsetApr 10, 2025 pm 10:09 PM

Penggunaan ZSET dalam Redis Cluster: ZSET adalah koleksi yang diperintahkan yang mengaitkan unsur -unsur dengan skor. Strategi Sharding: a. Hash Sharding: Mengedarkan nilai hash mengikut kunci ZSET. b. Pelbagai Sharding: Bahagikan ke dalam julat mengikut skor elemen, dan tetapkan setiap julat kepada nod yang berbeza. Baca dan tulis operasi: a. Baca Operasi: Jika kekunci ZSET adalah milik nod semasa, ia akan diproses secara tempatan; Jika tidak, ia akan dialihkan ke shard yang sepadan. b. Tulis Operasi: Sentiasa diarahkan ke Shards memegang kekunci ZSET.

Cara membersihkan data redisCara membersihkan data redisApr 10, 2025 pm 10:06 PM

Cara Mengosongkan Data Redis: Gunakan perintah Flushall untuk membersihkan semua nilai utama. Gunakan perintah flushdb untuk membersihkan nilai utama pangkalan data yang dipilih sekarang. Gunakan Pilih untuk menukar pangkalan data, dan kemudian gunakan FlushDB untuk membersihkan pelbagai pangkalan data. Gunakan perintah DEL untuk memadam kunci tertentu. Gunakan alat REDIS-CLI untuk membersihkan data.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.