下面是一个使用Redis实现并发防止库存超卖的案例:

<?php

// 初始化库存数量
$stock = 100;

// 初始化Redis连接
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 定义锁的标识
$lockKey = 'stock_lock';

// 模拟多个并发请求
for ($i = 0; $i < 10; $i++) {
    $pid = pcntl_fork();
    if ($pid == -1) {
        die("fork failed");
    } elseif ($pid == 0) {
        // 子进程中执行库存减少操作
        $result = $redis->set($lockKey, 1, ['nx', 'ex' => 10]); // 获取锁,设置过期时间为10秒

        if ($result) {
            // 锁获取成功,执行库存减少逻辑
            if ($stock > 0) {
                $stock--;
                echo "库存减少成功,当前库存为:" . $stock . PHP_EOL;
            } else {
                echo "库存不足,无法减少库存" . PHP_EOL;
            }

            // 释放锁
            $redis->del($lockKey);
        } else {
            // 锁获取失败,说明有其他进程正在执行库存减少操作
            echo "其他进程正在执行库存减少操作,本次操作失败" . PHP_EOL;
        }
        exit();
    }
}

// 等待所有子进程执行完毕
while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
}

上述案例中,通过使用Redis的set命令实现了一个分布式锁。在执行库存减少操作之前,先通过set命令去尝试获取锁,设置过期时间为10秒。如果获取锁成功,则执行库存减少逻辑,并在操作完成后释放锁。如果获取锁失败,则说明有其他进程正在执行库存减少操作,当前进程需要等待或放弃操作。

这样可以保证在多个并发请求中,只有一个请求能够成功执行库存减少操作,避免了库存超卖的问题

扮演PHP编程高手 redis并发防止库存超卖给个案例

原文地址: https://www.cveoy.top/t/topic/hVTz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录